如何在 ASP.NET 核心中使控制器成为作用域或单例而不是瞬态?
How to make controllers scoped or singleton instead of transient in ASP.NET Core?
如何在 ASP.NET Core 中使控制器成为作用域控制器或单例控制器而不是瞬态控制器?
我现在默认情况下,控制器已注册到具有瞬态生命周期的默认 DI 容器。
如果我想用不同的生命周期注册它们,我该怎么做?
我只是出于教育目的才知道这一点,以便更好地了解 DI 容器对控制器类型的管理。
I now that by default the controllers are registered with the default DI container with the transient lifetime.
默认情况下,控制器未注册根本。默认 IControllerActivator
会在没有显式注册的情况下创建该类型。
如果你想改变这个,你应该打电话:
services.AddMvc().AddControllersAsServices();
这将确保控制器已注册,并将原来的 IControllerActivator
替换为从 DI 容器解析控制器的 (ServiceBasedControllerActivator
)。
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);
如何在 ASP.NET Core 中使控制器成为作用域控制器或单例控制器而不是瞬态控制器?
我现在默认情况下,控制器已注册到具有瞬态生命周期的默认 DI 容器。
如果我想用不同的生命周期注册它们,我该怎么做?
我只是出于教育目的才知道这一点,以便更好地了解 DI 容器对控制器类型的管理。
I now that by default the controllers are registered with the default DI container with the transient lifetime.
默认情况下,控制器未注册根本。默认 IControllerActivator
会在没有显式注册的情况下创建该类型。
如果你想改变这个,你应该打电话:
services.AddMvc().AddControllersAsServices();
这将确保控制器已注册,并将原来的 IControllerActivator
替换为从 DI 容器解析控制器的 (ServiceBasedControllerActivator
)。
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);