gpt4 book ai didi

asp.net-core - 如何在 ASP.NET Core 中使 Controller 作用域或单例而不是 transient ?

转载 作者:行者123 更新时间:2023-12-03 15:48:19 26 4
gpt4 key购买 nike

如何在 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.


默认情况下, Controller 根本没有注册。它是默认的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com