如何在.NET Core中使用默认的依赖注入从父级创建一个子作用域?

32

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

// pseudocode

globalProvider.AddScoped<ExampleService>();

// ...

using (var scopedProvider = globalProvider.CreateChildScope())
{
    var exampleService = scopedProvider.Resolve<ExampleService>();
}
1个回答

53

使用 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);
}

文档:服务生命周期和注册选项

参考Microsoft.Extensions.DependencyInjection 或者Microsoft.AspNetCore.All 包来使用上述代码。


能否向作用域中添加新的依赖项? - t3chb0t
1
@t3chb0t 不行,在 BuildServiceProvider() 调用之后不能再进行新的注册。 - Ilya Chumakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接