1

我有以下界面

    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 实例(EmailSender 或 EventLogSender),如果他们选择使用电子邮件通知而不是事件日志通知,还如何为查询更新适当的电子邮件设置?**注意:查询可以有不同的通知方式,1 可以是偶数日志通知,而其他的可以都是电子邮件。

4

2 回答 2

0

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

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;
    }
}
于 2013-09-28T16:51:29.887 回答
0

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

您可以根据运行时数据注入/ SenderConstructorSenderFactorySender

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其中。

于 2016-03-12T13:40:38.023 回答