手动创建注册服务的范围

下面是一个例子:


//startup.cs

public 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 .cs

public 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它们是在哪个范围内创建的?


慕的地8271018
浏览 102回答 1
1回答

POPMUISE

免责声明:我自己还没有阅读过相关代码,但我相信这就是它基于我使用过的其他 DI 容器的工作原理。我通常不会使用 ASP.NET Core 中的默认值,因为它对我的用途来说有点限制。ASP.NET Core 主机构建器会自动创建依赖项注入容器。这实际上具有一个根范围,该范围从您创建容器时持续到您销毁它时(即应用程序关闭时)。在没有更具体的范围的情况下,这就是将使用的范围。在您的两个示例中,都适用相同的情况 - 它们是在没有更具体范围的情况下创建的。请注意,当我尝试您的代码时,我无法实例化来自 的范围服务ApplicationServices。我收到以下错误:“无法从根提供程序解析范围服务“TestObject”。”这表明在这种情况下如果没有范围,这是不可能的。
打开App,查看更多内容
随时随地看视频慕课网APP