我在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
访问。这一个也有一个类的实例,因为它是一个单例。
从现在起,由于您的所有服务和控制器都使用由框架创建的服务提供程序,而不是您在启动时手动创建的服务,因此它们都将获得相同的实例。