c# - 使用 Autofac 4.2.1 注入已注册的命名服务未按预期工作
问题描述
背景
Autofac 4.2.1(尝试使用最新版本的 Autofac 并且问题仍然存在),WebApi 项目 .netcore 2.2 问题:我有两个相同服务的实例,我注册到 ContainerBuilder 的名称为:
builder.RegisterType<ServiceOne>().Named<IService>("ServiceOne").SingleInstance();
builder.RegisterType<ServiceTwo>().Named<IService>("ServiceTwo").SingleInstance();
然后我根据需要将命名服务注入我的控制器类:
builder.Register(c => new KeysController(c.ResolveNamed<IService>("ServiceOne")));
builder.Register(c => new ValuesController(c.ResolveNamed<IService>("ServiceTwo")));
Autofac 无法按名称解析我的两个控制器的 IService。
例外
处理请求时发生未处理的异常。InvalidOperationException:尝试激活“AutoFacNaming.Controllers.ValuesController”时无法解析“AutoFacNaming.IService”类型的服务。
解决方案
默认情况下,ASP.net 核心不会从容器构建控制器,而只会构建它的参数。您可以通过指定AddControllersAsServices()
何时向服务集合注册 MVC 来更改此设置。这样做会IServiceCollection
在服务提供者工厂调用时自动将控制器类型注册到builder.Populate(services)
.
public class Startup
{
// Omitting extra stuff so you can see the important part...
public void ConfigureServices(IServiceCollection services)
{
// Add controllers as services so they'll be resolved.
services.AddMvc().AddControllersAsServices();
}
public void ConfigureContainer(ContainerBuilder builder)
{
// If you want to set up a controller for, say, property injection
// you can override the controller registration after populating services.
builder.Register(c => new KeysController(c.ResolveNamed<IService>("ServiceOne")));
builder.Register(c => new ValuesController(c.ResolveNamed<IService>("ServiceTwo")));
}
}
推荐阅读
- mysql - MySQL XAMPP 总是打开一个网络命令弹出窗口
- r - 在地图函数中使用条件改变多个列
- java - Java 8 Stream,由于几个条件而获取字符串长度
- ssl - 在 JBoss EAP 6.4 中禁用主机名验证
- reactjs - 属性...在类型“IntrinsicAttributes & ...”上不存在
- c# - HttpResponse.TransmitFile 方法(但对于多个文件)?
- node.js - how to host angular and node js project on the shared hosting (cpanel or plesk)?
- awesome-wm - 当 input_passthrough 为真时,awesome-wm wibox 对鼠标信号没有反应
- c++ - 无法使用 CMake 编译 MagickWand
- spring-data-jpa - SimpleJdbcCall 跳过第一个输入参数