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

そして、リクエストにいくつかのロジックをラップして、タイプを決定します。リフレクションを使用することもできます。

編集

つまり、2 つのオブジェクト インスタンスを作成して、if/else ステートメントに基づいてメッセージを渡すことはできないのでしょうか?

2回目の編集

さらに熟考すると(しゃれが意図されています)、必要なのはFactoryメソッドパターンだと思います:

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 ) を把握し、イベントログ通知の代わりに電子メール通知を使用することを選択した場合に、クエリの適切な電子メール設定を新たに作成するにはどうすればよいですか?

実行時データに基づいて作成するSenderConstructor/を注入できます。SenderFactorySender

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 に答える