AddSingleton 是否保证 运行 只有在 asp.net 核心中的工厂一次?
Is AddSingleton guaranteed to run only once the factory in asp.net core?
比如有多个请求过来,每个请求都向DI请求这个单例服务。使用
添加服务
public static IServiceCollection AddSingleton<TService>(
this IServiceCollection services,
Func<IServiceProvider, TService> implementationFactory)
where TService : class
重载,工厂方法能保证只运行一次吗?
文档不是很具体,但是你可以保证,在内置容器(MS.DI)的上下文中,工厂保证最多被调用一次每个 IServiceProvider 实例.
虽然我没有强有力的证据来证明这一说法,但完整的应用程序和框架都是围绕着这一假设得到保证而构建的。
请注意以下事项:
- 虽然任何第 3 方适配器实现可能没有那么强的保证,但应该期望与 MS.DI.
相同的行为
- Singleton 的定义是它的“范围”为单个容器实例的生命周期,即
IServiceProvider
。 MS.DI 遵循此定义,这意味着基于相同的 IServiceCollection
创建新的 IServiceProvider
(例如通过调用 BuildServiceProvider()
)将允许工厂委托再次被调用新 IServiceProvider
.
在 ASP.NET 核心应用程序中(除非您覆盖它),框架管理 ServiceCollection
的创建及其结果 ServiceProvider
。这意味着在应用程序的持续时间内只有一个 ServiceProvider
,这意味着您的 Singleton 工厂委托只被调用一次。
然而,当您开始手动调用 CreateServiceProvider()
时,您将创建额外的 IServiceProvider
实例,并为其创建自己的 Singleton 实例,这意味着对 Singleton 工厂委托的额外调用。
比如有多个请求过来,每个请求都向DI请求这个单例服务。使用
添加服务public static IServiceCollection AddSingleton<TService>(
this IServiceCollection services,
Func<IServiceProvider, TService> implementationFactory)
where TService : class
重载,工厂方法能保证只运行一次吗?
文档不是很具体,但是你可以保证,在内置容器(MS.DI)的上下文中,工厂保证最多被调用一次每个 IServiceProvider 实例.
虽然我没有强有力的证据来证明这一说法,但完整的应用程序和框架都是围绕着这一假设得到保证而构建的。
请注意以下事项:
- 虽然任何第 3 方适配器实现可能没有那么强的保证,但应该期望与 MS.DI. 相同的行为
- Singleton 的定义是它的“范围”为单个容器实例的生命周期,即
IServiceProvider
。 MS.DI 遵循此定义,这意味着基于相同的IServiceCollection
创建新的IServiceProvider
(例如通过调用BuildServiceProvider()
)将允许工厂委托再次被调用新IServiceProvider
.
在 ASP.NET 核心应用程序中(除非您覆盖它),框架管理 ServiceCollection
的创建及其结果 ServiceProvider
。这意味着在应用程序的持续时间内只有一个 ServiceProvider
,这意味着您的 Singleton 工厂委托只被调用一次。
然而,当您开始手动调用 CreateServiceProvider()
时,您将创建额外的 IServiceProvider
实例,并为其创建自己的 Singleton 实例,这意味着对 Singleton 工厂委托的额外调用。