在 asp.net 核心中创建作用域工厂



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

我已经尝试在每种方法中创建它。 它有效,但我认为这是开销。

var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>();
var scope = scopeFactory.CreateScope();
var scopedContainer = scope.ServiceProvider;

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

从技术上讲,您这样做的方式并不正确。如果在单一实例服务中,并且需要访问作用域内的服务,则应创建新的服务作用域,并从该作用域的服务提供程序检索服务。完成后,您还应该处理范围

在实践中,您可以稍微简化一下。应避免将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();
        }
    }
}

如您所见,这并没有那么多开销。但是,当然,这会使您在是否要在单一实例中使用作用域服务时三思而后行。

最新更新