为了账号安全,请及时绑定邮箱和手机立即绑定

手动创建注册服务的范围

手动创建注册服务的范围

C#
慕的地8271018 2023-09-24 16:20:07
下面是一个例子://startup.cspublic void ConfigureServices(IServiceCollection services){ services.AddScoped<IMyScopedService, MyScopedService>(); services.AddScoped<AnotherScopedService , AnotherScopedService >(); var serviceProvider = services.BuildServiceProvider(); var serviceScopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>(); IMyScopedService scopedOne; IMyScopedService scopedTwo; IMyScopedService scopedThree; IMyScopedService scopedFour; using (var scope = serviceScopeFactory.CreateScope()) {    scopedOne = scope.ServiceProvider.GetService<IMyScopedService>();    scopedTwo = scope.ServiceProvider.GetService<IMyScopedService>(); } using (var scope = serviceScopeFactory.CreateScope()) {    scopedThree = scope.ServiceProvider.GetService<IMyScopedService>(); } scopedFour = serviceProvider.GetService<IMyScopedService>(); AnotherScopedService.getSomething(app.ApplicationServices);}//AnotherScopedService .cspublic class AnotherScopedService {   ...   public static void getSomething(IServiceProvider serviceProvider)   {      IMyScopedService scopedFive = serviceProvider.GetRequiredService<IMyScopedService>();      ...   }}我知道scopedOne和scopedTwo实际上是同一个对象,因为它们是在同一范围内创建的,并且是与和scopedThree不同的对象。scopedOnescopedTwo以下是我的问题:Q1-在哪个范围下scopedFour创建的?我没有手动创建 的作用域scopedFour,那么scopedFourget 是通过ConfigureServices方法的作用域创建的吗?Q2- 和 怎么样scopedFour,scopedFive它们是在哪个范围内创建的?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

免责声明:我自己还没有阅读过相关代码,但我相信这就是它基于我使用过的其他 DI 容器的工作原理。我通常不会使用 ASP.NET Core 中的默认值,因为它对我的用途来说有点限制。

ASP.NET Core 主机构建器会自动创建依赖项注入容器。这实际上具有一个根范围,该范围从您创建容器时持续到您销毁它时(即应用程序关闭时)。

在没有更具体的范围的情况下,这就是将使用的范围。在您的两个示例中,都适用相同的情况 - 它们是在没有更具体范围的情况下创建的。

请注意,当我尝试您的代码时,我无法实例化来自 的范围服务ApplicationServices。我收到以下错误:

“无法从根提供程序解析范围服务“TestObject”。”

这表明在这种情况下如果没有范围,这是不可能的。

查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信