【问题标题】:How to create a child scope from the parent with default dependency injection in .NET Core?如何在 .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>();
}

【问题讨论】:

    标签: .net asp.net-core inversion-of-control .net-core ioc-container


    【解决方案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() 调用后无法进行新注册。
    猜你喜欢
    • 2020-06-21
    • 2018-10-16
    • 2022-08-11
    • 2019-03-14
    • 2020-04-17
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多