Я работаю над веб-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?
http://stackoverflow.com/questions/18665324/unity-register-for-one-interface-multiple-object-and-tell-unity-where-to-inject –
Когда вы начинаете с именованных регистраций, это лучше переключиться на [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/ –