用于依赖关系注入的运行时数据

本文关键字:运行时 数据 注入 依赖 关系 用于 | 更新日期: 2023-09-27 18:33:05

>我有以下界面

    public interface ISender
    {
          void SendMessage(string msg);
    }

以及以下实现

 public class EmailSender : ISender
 {
     private EmailSettings _emailSettings;
     EmailSender(EmailSettings _emailSettings)
     public SendMessage(string msg);
 }
public class EventLogSender : ISender
{
    void SendMessage(string msg);
}
public class QuerySetting
{
   string statementToExecute;
   int MStoWaitBeforeExecute;
   // if set to true then use email settings to perform notification through email
   bool UseEmail;
   EmailSettings EmailSettings;
}
public class EmailSettings
{
   string serverip;
   int port;
   string username;
   string password;
  string MailToAddress;
}

在运行时,查询列表将加载到应用程序中。 每个查询都包含有关执行查询的频率的信息、有关何时为查询触发警报的信息,以及有关在发生警报时向谁发送电子邮件的电子邮件信息(或者如果未设置,警报应仅写入事件日志)。 如何在运行时使用依赖注入来了解要创建的 ISender 的哪个实例(电子邮件发件人或事件日志发件人),如果他们选择使用电子邮件通知而不是事件日志通知,还要为查询更新适当的电子邮件设置?**注意:查询可以有不同的通知方法,1 可以是偶数日志通知,而其他可以全部是电子邮件。

用于依赖关系注入的运行时数据

我不确定依赖注入是你需要的,看看

Activator.CreateInstance

http://msdn.microsoft.com/en-us/library/d133hta4.aspx

并在请求中包装一些逻辑以确定类型。您也可以使用反射。

编辑

综上所述,您不能只创建两个对象实例并根据 if/else 语句传递消息吗?

第二次编辑

经过进一步思考(双关语),我认为您需要的是工厂方法模式:

http://en.wikipedia.org/wiki/Factory_method_pattern

例:

public class ObjectFactory
{
    public static IObjectController CreateObjectController(ObjectSettings settings)
    {
        IObjectController result = (settings.PINK ? new PinkObject() : (IObjectController) new BlueObject());
        result.Initialise(settings);
        return result;
    }
}

如何在运行时使用依赖注入来了解要创建的 ISender 的哪个实例(电子邮件发件人或事件日志发件人),如果他们选择使用电子邮件通知而不是事件日志通知,还要为查询更新适当的电子邮件设置?

您可以注入基于运行时数据创建SenderSenderConstructor/SenderFactory

class Controller
    private readonly SenderConstructor as func(of QuerySetting, ISender)
    public sub new(SenderConstructor as func(of QuerySetting, ISender))
        me.SenderConstructor = SenderConstructor
    end sub
    public function Send(Message as string, Settings as QuerySetting) as Unit
        dim Sender = SenderConstructor(Settings)
        Sender.SendMessage(Message)
    end function
end class

SenderConstructor在程序的最高级别定义,并在 IoC 容器中注册(容器中的注册不会显示,因为它特定于容器):

dim SenderConstructor =
    function(Settings as QuerySetting) as ISender
        return if(Settings.UseEmail, new EmailSender(Settings.EmailSettings), new EventLogSender)
    end function

创建Controller时,IoC 容器会将SenderConstructor注入其中。