Asp.net 从创建控制器的Unity解析名称注册

Asp.net 从创建控制器的Unity解析名称注册,asp.net,asp.net-web-api,dependency-injection,unity-container,asp.net-apicontroller,Asp.net,Asp.net Web Api,Dependency Injection,Unity Container,Asp.net Apicontroller,我正在开发一个包含多个Web API控制器的ASP.NET Web API。每个控制器都依赖于IMessageSender public class OrderController: ApiController { private readonly IMessageSender _msgSender; public OrderController(IMessageSender msgSender) { _msgSender = msSender; } }

我正在开发一个包含多个Web API控制器的ASP.NET Web API。每个控制器都依赖于IMessageSender

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和Unity.WebApi进行依赖项解析,并已注册了3个IMessageSender命名注册

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud");
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem");
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc");
container.RegisterType(“rescloud”);
container.RegisterType(“resinmem”);
container.RegisterType(“res nsvc”);
我面临的问题是,对于不同的控制器,我需要使用不同的IMessageSender实现。例如,
OrdersController
需要使用
CloudMessageSender
,但是
CustomersController
需要使用
InMemoryMessageSender
。默认情况下,Unity将注入未命名的解决方案或(在我的例子中)第一个解决方案


我如何指定或控制应向哪个控制器注入哪个IMessageSender实现?

您可以将容器配置为也向注入成员注册控制器类型。在注入成员列表中,您可以通过名称解析已注册的依赖项。这样可以确保在创建控制器实例时解析正确的类型

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));
container.RegisterType(“rescloud”);
container.RegisterType(“resinmem”);
container.RegisterType(“res nsvc”);
var messageSender=新解析的参数(“res cloud”);
RegisterType(新注入构造函数(messageSender));
现在,当初始化
OrderController
实例时,
msgSender
参数的类型将解析为
CloudMessageSender

这种注册控制器的方法的一个问题是,您需要解析并传递控制器构造函数的所有参数


Unity不支持在不使用此方法的情况下基于名称解析类型。

当您开始进行命名注册时,最好切换到。有关更多详细信息,请参阅本文:“Unity不支持在不使用此方法的情况下基于名称解析类型。”-这是不使用Unity的一个很好的理由。它已经好几年没有更新了,这是另一个事实。是否使用它取决于具体情况。与其他设备(如Castle Windsor)相比,使用带有MVC的单元简化了设置和配置。同意,Unity应该升级自己,使其与国际奥委会的容器保持一致。