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 实例,因为它是一个单例。
并且从现在开始,由于您所有的服务和控制器都使用框架创建的服务提供者,而不是您在启动时手动创建的服务提供者,因此它们都将获得相同的实例。
我像这样在 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=]
并在配置方法中请求服务,像这样 当我在其他服务的构造函数中请求它时,它将 return 相同的对象。 为什么?services.AddSingleton<ITest, Test>();
var test = app.ApplicationServices.GetRequiredService<ITest>();
在您的启动文件中,您还没有服务提供商。您只有 Services
属性 允许您 定义 您的服务。
因为你想实例化一个,你调用 builder.Services.BuildServiceProvider()
,它 为你构建 一个服务提供者,然后你用它来获得服务。在 that 服务提供商中,您的服务作为单例运行。
然后,您继续您的应用程序和框架,很高兴您定义了您的服务,然后构建它自己的 服务提供者。您可以通过 app.ApplicationServices
访问。那个也有一个你的 class 实例,因为它是一个单例。
并且从现在开始,由于您所有的服务和控制器都使用框架创建的服务提供者,而不是您在启动时手动创建的服务提供者,因此它们都将获得相同的实例。