структура карты добавить словарь список интерфейсов - PullRequest
1 голос
/ 17 ноября 2011

Скажем, у меня есть список обработчиков протоколов, и клиентская служба знает, какой протокол использовать, основываясь на значении enum, было бы неплохо выбрать протокол из списка переданных i / fs.

Как мне добиться этого в StructureMap?:

   public EmailTransportService(interfaces...,
                               IDictionary<EmailAccountType, IEmailTransportHandler> transportHandlers)

В настоящее время я использую ObjectFactory с экземпляром get named, таким образом:

  _emailTransportHandlers = new Dictionary<EmailAccountType, string>
                                        {
                                            {EmailAccountType.Pop3, "Pop3Handler"},
                                            {EmailAccountType.IMAP, "IMapHandler"}
                                        };

, а затем разрешаю следующим образом:

 private IEmailTransportHandler GetTransportHandler(EmailAccountType accountType)
        {            
            return ObjectFactory.GetNamedInstance<IEmailTransportHandler>(_emailTransportHandlers[accountType]);
        }

но мне не нравится это, так как в моих модульных тестах сложно проверить вызовы обработчиков.

Мой реестр служб выглядит так:

 public EmailTransportServiceRegistry()
 {
            Scan(x =>
                     {
                        ....                      
                     });

            For<IEmailTransportHandler>().Use<ActiveUpPop3Handler>().Named("Pop3Handler");
            For<IEmailTransportHandler>().Use<ActiveUpIMap4Handler>().Named("IMapHandler");
}

Так что, в основном, я полагаюсь на именованные экземпляры на основе словарного списка типов протоколов.

1 Ответ

0 голосов
/ 01 декабря 2011

Мое решение состояло в том, чтобы иметь метод статического регистра из клиентской службы, например, так:

public static IDictionary<EmailAccountType, IEmailTransportHandler> RxHandlerRegistration()
        {
            return new Dictionary<EmailAccountType, IEmailTransportHandler>
                       {                                 
                           // following registrations use ActiveUp library for pop3/imap (http://mailsystem.codeplex.com/)
                           {EmailAccountType.Pop3, ObjectFactory.GetInstance<ActiveUpPop3Handler>()},
                           {EmailAccountType.IMAP, ObjectFactory.GetInstance<ActiveUpIMap4Handler>()}
                       };
        }

Затем в классе ServiceRegistry:

 public class EmailTransportServiceRegistry : ServiceRegistry
    {
        public EmailTransportServiceRegistry()
        {    
            // other registries...    
            For<IDictionary<EmailAccountType, IEmailTransportHandler>>().Use(x => EmailTransportService.RxHandlerRegistration());
        }
    }
...