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

问题描述 投票:9回答:1

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

// pseudocode

globalProvider.AddScoped<ExampleService>();

// ...

using (var scopedProvider = globalProvider.CreateChildScope())
{
    var exampleService = scopedProvider.Resolve<ExampleService>();
}
.net asp.net-core inversion-of-control .net-core ioc-container
1个回答
22
投票

使用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包使用上面的代码。

© www.soinside.com 2019 - 2024. All rights reserved.