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), а также новые параметры электронной почты для запроса, если они решили использовать уведомление по электронной почте вместо уведомления о событиях? ** ПРИМЕЧАНИЕ. В запросах могут быть разные методы уведомления, 1 может быть уведомлением о стандартном блоке, в то время как другие могут быть только электронной почтой.

ответ

0

Я инъекция не уверена зависимости является то, что вам нужно, посмотри на

Activator.CreateInstance 

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

И обернуть некоторую логику в запросе, чтобы определить тип. Вы также можете использовать отражение.

EDIT

Все, что сказал можно не просто создать два экземпляра объекта и передать сообщение на основе, если/другое заявление?

ВТОРОЙ EDIT

После дальнейшего отражения (каламбур) Я думаю, что вам нужно, это метод 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; 
    } 
} 
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.

Смежные вопросы