Asp.net 从创建控制器的Unity解析名称注册
我正在开发一个包含多个Web API控制器的ASP.NET Web API。每个控制器都依赖于IMessageSenderAsp.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; } }
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应该升级自己,使其与国际奥委会的容器保持一致。