繁体   English   中英

在 asp.net core 中创建范围工厂

[英]Create scope factory in asp.net core

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

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

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

当我需要它时,我会在每种方法中编写它。 我认为这是逻辑错误。 请解释我如何正确地做到这一点? 谢谢你

从技术上讲,您这样做的方式并没有错。 如果您在单例服务中并且需要访问范围服务,那么您应该创建一个新的服务范围并从该范围的服务提供者处检索服务。 完成后,您还应该处理 scope

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

如您所见,方面的开销并不多。 但这当然会让您三思是否要在单例中使用范围服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM