DI 单例服务实例化两次

DI Singleton Service Instantiates Twice

我像这样在 program.cs 文件中将服务注册为 Singleton。

builder.Services.AddSingleton<ITest, Test>();

如果我在 program.cs

中请求它的实例
var testService = builder.Services.BuildServiceProvider()
                                  .GetRequiredService<ITest>();

它创建了一个新对象,这是第一个对象,但是当我通过构造函数注入在其他一些服务中请求它时,它再次创建了一个新对象。 return 它不应该是它在 Program.cs 启动时创建的第一个对象吗?

注意: 只有我在 program.cs 中请求服务时才会出现此行为,除此之外它 return 是同一个对象,即使我请求它使用 IServiceProvider.GetRequiredService();

我已经在 dot net 5 web api 中测试了相同的场景,我也在 Startu.cs 文件[的ConfigureServices 方法中注册了服务。 =14=]

services.AddSingleton<ITest, Test>();

并在配置方法中请求服务,像这样

 var test = app.ApplicationServices.GetRequiredService<ITest>();

当我在其他服务的构造函数中请求它时,它将 return 相同的对象。

为什么?

在您的启动文件中,您还没有服务提供商。您只有 Services 属性 允许您 定义 您的服务。

因为你想实例化一个,你调用 builder.Services.BuildServiceProvider(),它 为你构建 一个服务提供者,然后你用它来获得服务。在 that 服务提供商中,您的服务作为单例运行。

然后,您继续您的应用程序和框架,很高兴您定义了您的服务,然后构建它自己的 服务提供者。您可以通过 app.ApplicationServices 访问。那个也有一个你的 class 实例,因为它是一个单例。

并且从现在开始,由于您所有的服务和控制器都使用框架创建的服务提供者,而不是您在启动时手动创建的服务提供者,因此它们都将获得相同的实例。