C# 在ASP.NET Core中向Autofac注册应用程序生命周期范围的服务
根据,在C# 在ASP.NET Core中向Autofac注册应用程序生命周期范围的服务,c#,asp.net-core,autofac,C#,Asp.net Core,Autofac,根据,在ConfigureServices()中的ContainerBuilder已在请求范围内: 使用InstancePerLifetimeScope而不是InstancePerRequest。[…]随着Microsoft.Extensions.DependencyInjection的引入,每个请求和其他子生命周期范围的创建现在是框架提供的一致性容器的一部分,因此所有子生命周期范围都被平等对待-不再有特殊的“请求级别范围” 这使得注册请求生命周期范围的服务更容易,但是如何将服务注册为应用程序生
ConfigureServices()
中的ContainerBuilder
已在请求范围内:
使用InstancePerLifetimeScope
而不是InstancePerRequest
。[…]随着Microsoft.Extensions.DependencyInjection
的引入,每个请求和其他子生命周期范围的创建现在是框架提供的一致性容器的一部分,因此所有子生命周期范围都被平等对待-不再有特殊的“请求级别范围”
这使得注册请求生命周期范围的服务更容易,但是如何将服务注册为应用程序生命周期范围的服务?
上下文/示例
我们有一些提供在整个应用程序生命周期内不会更改的信息的服务,例如AutoMapper配置文件。其中一些是需要大量计算才能实例化的,所以我真的希望只在应用程序启动时实例化它们,而不是针对每个请求。您可以使用
SingleInstance
方法将组件创建为单例。
如果要在应用程序启动时实例化它们,可以让组件实现IStartable
或使用AutoActivate
方法注册它们:
builder
.RegisterType<TypeRequiringWarmStart>()
.SingleInstance()
.AutoActivate();
builder
.RegisterType()
.SingleInstance()
.AutoActivate();
有关更多信息,请参见和作为@Cyril答案的替代方案,您可以使用内置容器注册服务。当您调用Autofac的
Populate
方法时,它将在应用程序范围内注册服务
services.AddSingleton<IMyService, MyService>();
services.AddSingleton();
是否会在我们注册的生存期范围内创建单个实例?如果是这种情况,那么我们将返回到每个请求的实例…@theDmi:nop,单实例意味着将为容器创建一次组件。有关更多信息,请参阅。