Asp.net-Core
如何在 ASP.NET Core 中使控制器作用域或單例而不是瞬態?
如何在 ASP.NET Core 中使控制器作用域或單例而不是瞬態?
我現在預設情況下,控制器註冊到具有瞬態生命週期的預設 DI 容器。
如果我想用不同的生命週期註冊它們,我該怎麼做?
我想知道僅出於教育目的,以便更好地了解 DI 容器的控制器類型管理。
我現在預設情況下,控制器註冊到具有瞬態生命週期的預設 DI 容器。
預設情況下,控制器根本**沒有註冊。在沒有顯式註冊的情況下創建該類型是預設設置。
IControllerActivator如果你想改變這個,你應該打電話:
services.AddMvc().AddControllersAsServices();這將確保控制器已註冊,並且原始控制器
IControllerActivator被替換為ServiceBasedControllerActivator從 DI 容器中解析控制器的 ( )。
AddControllersAsServices,不幸的是,始終使用 Transient 生活方式註冊控制器,並且無法覆蓋該行為。所以你必須重新實現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);