1

我有以下接口RunTime依賴注入的數據?

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),以及如果他們選擇使用電子郵件通知而不是事件日誌通知,則可以爲查詢創建適當的電子郵件設置? **注意:Querys可以有不同的通知方法,1可以是evenlog通知,而其他可能只有所有電子郵件。

回答

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; 
    } 
} 
0

我如何使用依賴注入,在運行時,如果他們選擇使用電子郵件通知而不是事件日誌通知,要知道要創建ISender的實例(EmailSender或EventLogSender),還要爲查詢新增適當的電子郵件設置?

您可以注入SenderConstructor/SenderFactory,根據運行時數據創建Sender

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