Asp.net-Core

如何在 ASP.NET Core 中使控制器作用域或單例而不是瞬態?

  • September 28, 2020

如何在 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);

引用自:https://stackoverflow.com/questions/62790945