根据Autofac documentation,ContainerBuilder
中的ConfigureServices()
已经是请求范围的:
使用
InstancePerLifetimeScope
代替InstancePerRequest
。 [...]随着Microsoft.Extensions.DependencyInjection
的引入,每个请求和其他子生命周期范围的创建现在是框架提供的符合容器的一部分,因此所有子生命周期范围都被平等对待 - 没有特殊之处“请求级别范围”了。
这使得请求生命周期范围服务的注册更容易,但如何将服务注册为应用程序生命周期范围?
我们提供一些服务,提供在整个应用程序生命周期内不会发生变化的信息,例如AutoMapper配置文件。其中一些是实例化的计算密集型,所以我真的只想在应用程序启动时实例化它们,而不是每个请求。
答案 0 :(得分:1)
您可以使用var words = (from w in db.Words
join wf in db.WordForms
on w.WordId equals wf.WordId into wwf
from x in wwf.DefaultIfEmpty()
where x == null
select w)
.AsNoTracking()
.ToList();
方法将组件创建为单例。
如果要在应用程序启动时实例化它们,可以让组件实现SingleInstance
或使用IStartable
方法注册它们:
AutoActivate
有关详细信息,请参阅Instance scope - single instance和Running code at startup
答案 1 :(得分:0)
作为@ Cyril答案的替代方案,您可以使用内置容器注册服务。当您调用Autofac的Populate
方法时,它将使用应用程序范围注册服务。
services.AddSingleton<IMyService, MyService>();