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 工厂委托的额外调用。