DI Singleton服务实例化两次



我在program.cs文件中将服务注册为Singleton,如下所示。

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

如果我在程序.cs 中请求一个实例

var testService = builder.Services.BuildServiceProvider()
.GetRequiredService<ITest>();

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

注意:只有当我在程序.cs中请求服务时,才会出现这种行为,而不是它返回相同的对象,即使我使用IServiceProvider.GetRequiredService((请求它;

我在dot net 5 web api中也测试了相同的场景,在该场景中,我在Startu.cs文件的ConfigureServices方法中注册了服务

services.AddSingleton<ITest, Test>();

并在配置方法中请求服务,如此

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

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

为什么?

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

由于您想实例化一个,所以您可以调用builder.Services.BuildServiceProvider()为您构建服务提供程序,然后使用它来获取服务。在服务提供商的中,您的服务是单例的。

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

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

最新更新