作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 ASP.NET Core 中使 Controller 作用域或单例而不是 transient ?
我现在默认情况下, Controller 注册到具有 transient 生命周期的默认 DI 容器。
如果我想用不同的生命周期注册它们,我该怎么做?
我想知道这仅仅是出于教育目的,以便更好地了解 DI 容器的 Controller 类型管理。
最佳答案
I now that by default the controllers are registered with the default DI container with the transient lifetime.
IControllerActivator
即在没有显式注册的情况下创建该类型。
services.AddMvc().AddControllersAsServices();
这将确保 Controller 已注册和原始
IControllerActivator
被替换为一个(
ServiceBasedControllerActivator
),它从 DI 容器解析 Controller 。
AddControllersAsServices
不幸的是,总是使用 Transient 生活方式注册 Controller ,并且无法覆盖该行为。所以你必须重新实现
AddControllersAsServices
:
public static IMvcBuilder AddControllersAsServices(
this IMvcBuilder builder, ServiceLifetime lifetime)
{
var feature = new ControllerFeature();
builder.PartManager.PopulateFeature(feature);
foreach (var controller in feature.Controllers.Select(c => c.AsType()))
{
builder.Services.Add(
ServiceDescriptor.Describe(controller, controller, lifetime));
}
builder.Services.Replace(ServiceDescriptor
.Transient<IControllerActivator, ServiceBasedControllerActivator>());
return builder;
}
这种新的扩展方法可以如下使用:
services.AddMvc().AddControllersAsServices(ServiceLifetime.Singleton);
关于asp.net-core - 如何在 ASP.NET Core 中使 Controller 作用域或单例而不是 transient ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62790945/
我是一名优秀的程序员,十分优秀!