如何在 .NET Core 中使用默认依赖注入从父级创建子范围?

Posted

技术标签:

【中文标题】如何在 .NET Core 中使用默认依赖注入从父级创建子范围?【英文标题】:How to create a child scope from the parent with default dependency injection in .NET Core? 【发布时间】:2017-09-29 01:36:09 【问题描述】:

我正在构建一个控制台 .NET Core 应用程序。它定期运行一个可以完成某些工作的方法。如何使 ServiceProvider 的行为方式与它在 ASP.NET Core 应用程序中的行为方式相同。我希望它在方法开始执行时解析范围服务,并在方法结束时处理解析的服务。

// pseudocode

globalProvider.AddScoped<ExampleService>();

// ...

using (var scopedProvider = globalProvider.CreateChildScope())

    var exampleService = scopedProvider.Resolve<ExampleService>();

【问题讨论】:

【参考方案1】:

使用IServiceProvider.CreateScope()方法创建本地作用域:

var services = new ServiceCollection();
services.AddScoped<ExampleService>();
var globalProvider = services.BuildServiceProvider();

using (var scope = globalProvider.CreateScope())

    var localScoped = scope.ServiceProvider.GetService<ExampleService>();

    var globalScoped = globalProvider.GetService<ExampleService>();

很容易测试:

using (var scope = globalProvider.CreateScope())

    var localScopedV1 = scope.ServiceProvider.GetService<ExampleService>();
    var localScopedV2 = scope.ServiceProvider.GetService<ExampleService>();
    Assert.Equal(localScopedV1, localScopedV2);

    var globalScoped = globalProvider.GetService<ExampleService>();
    Assert.NotEqual(localScopedV1, globalScoped);
    Assert.NotEqual(localScopedV2, globalScoped);

文档:Service Lifetimes and Registration Options。

参考Microsoft.Extensions.DependencyInjection 或者只是Microsoft.AspNetCore.All 包使用上面的代码。

【讨论】:

是否可以向作用域添加新的依赖项? @t3chb0t 否,BuildServiceProvider() 调用后无法进行新注册。

以上是关于如何在 .NET Core 中使用默认依赖注入从父级创建子范围?的主要内容,如果未能解决你的问题,请参考以下文章

使用默认 ASP.NET Core DI 容器在 Service Fabric 上设置依赖注入

如何在 .Net Core ActionFilterAttribute 中使用依赖注入?

.NET Core 默认依赖注入与 Castle DynamicProxy

如何在 ASP.NET CORE 中使用具有依赖注入的动作过滤器?

ASP.NET Core 依赖注入(DI)

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)