在ASP.NET Core中创建范围工厂

Gia*_*omo 1 c# dependency-injection asp.net-core

我想在asp.net核心中创建作用域容器,并在我的singleton方法的2种方法中使用它。

我试过在sigleton的每种方法中创建此方法。它有效,但是我认为这是开销。

        var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>();
        var scope = scopeFactory.CreateScope();
        var scopedContainer = scope.ServiceProvider;
Run Code Online (Sandbox Code Playgroud)

在需要时,我会在每种方法中编写它。我认为这是逻辑错误。请给我解释一下如何正确执行?谢谢

pok*_*oke 7

从技术上讲,您的操作方式并不正确。如果您位于单例服务中,并且需要访问作用域服务,则应创建一个新的服务作用域,并从该作用域的服务提供者中检索服务。完成后,还应该处置范围

在实践中,您可以稍微简化一下。您应该避免IServiceProvider直接注入服务。相反,您可以直接注入IServiceScopeFactory。然后,您还应该使用using声明创建作用域,以确保在使用后正确处置它。

因此,单例服务示例如下所示:

public class ExampleSingletonService
{
    private readonly IServiceScopeFactory _serviceScopeFactory;

    public ExampleSingletonService(IServiceScopeFactory serviceScopeFactory)
    {
        _serviceScopeFactory = serviceScopeFactory;
    }

    public async Task DoSomethingAsync()
    {
        using (var scope = _serviceScopeFactory.CreateScope())
        {
            var db = scope.ServiceProvider.GetService<MyDbContext>();

            db.Add(new Foo());
            await db.SaveChangesAsync();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,是不是真的了这么多的开销。但这当然会让您三思而后行,是否要在单个实例中使用作用域服务。