Скажем, у меня есть список обработчиков протоколов, и клиентская служба знает, какой протокол использовать, основываясь на значении 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");
}
Так что, в основном, я полагаюсь на именованные экземпляры на основе словарного списка типов протоколов.