0

Я работаю над веб-API ASP.NET, который содержит несколько контроллеров веб-API. Каждый контроллер имеет зависимость от IMessageSender.Разрешить регистрацию имен от Unity, которые создают контроллер

public class OrderController: ApiController { 
    private readonly IMessageSender _msgSender; 
    public OrderController(IMessageSender msgSender) { 
     _msgSender = msSender; 
    } 
} 

У меня есть 3 различных различных реализаций IMessageSender - CloudMessageSender, InMemoryMessageSender и NServiceBusMessageSender.

public class CloudMessageSender: IMessageSender 
{ 
} 
public class InMemoryMessageSender: IMessageSender 
{ 
} 
public class NServiceBusMessageSender: IMessageSender 
{ 
} 

Я использую единство и Unity.WebApi для разрешения зависимостей и зарегистрированы 3 именованных регистрации IMessageSender

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

Проблема, с которой я столкнулся в том, что для различных контроллеров нужно использовать другие Внедрение IMessageSender. Ex. OrdersController необходимо использовать CloudMessageSender, но CustomersController необходимо использовать InMemoryMessageSender. По умолчанию Unity вводит либо неименованное разрешение, либо (в моем случае) первое.

Как я могу указать или контролировать, какой контроллер следует вводить с помощью реализации IMessageSender?

+0

http://stackoverflow.com/questions/18665324/unity-register-for-one-interface-multiple-object-and-tell-unity-where-to-inject –

+0

Когда вы начинаете с именованных регистраций, это лучше переключиться на [Pure DI] (http://blog.ploeh.dk/2014/06/10/pure-di/). См. Эту статью для получения дополнительной информации: http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –

ответ

1

Вы можете сконфигурировать контейнер для регистрации для типа контроллера также с элементами впрыска. В списке членов инъекции вы можете разрешить уже зарегистрированные зависимости по имени. Таким образом, убедитесь, что правильный тип будет разрешен при создании экземпляра контроллера.

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

var messageSender = new ResolvedParameter<IMessageService>("res-cloud"); 
container.RegisterType<OrderController>(new InjectionConstructor(messageSender)); 

Теперь, когда OrderController экземпляр инициализируется, тип msgSender аргумента будет решен до CloudMessageSender.

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

Unity не поддерживает разрешающие типы на основе имени без использования этого подхода.

+0

«Unity не поддерживает разрешающие типы на основе по имени без использования этого подхода ». - что является хорошей причиной не использовать Unity. Еще один факт, что он не обновлялся через несколько лет. – NightOwl888

+0

Хорошо, использовать ли это или нет, зависит от случая. Использование устройства с MVC упрощает настройку и настройку по сравнению с другими, такими как Castle Windsor. Согласитесь, что Unity должны были обновиться, чтобы соответствовать контейнерам IoC. –

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