【问题标题】:Create scope factory in asp.net core在 asp.net core 中创建作用域工厂
【发布时间】:2019-03-27 15:47:58
【问题描述】:

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

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

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

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

【问题讨论】:

  • 从技术上讲。错误很可能首先是您的服务是单例的。如果它需要使用范围服务,那么有一个强有力的论据认为它也应该是范围的。
  • 这个错误很可能是你有很多方法需要这个逻辑。只有基础设施组件,你的Composition Root 的一部分应该需要这个,这将导致你需要创建一个新范围的少数(最多)地方。

标签: c# asp.net-core dependency-injection


【解决方案1】:

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

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

如您所见,实际上并没有那么太多的开销。但是,这当然会让您三思而后行,是否要在单例中使用范围服务。

【讨论】:

  • 谢谢你,已经看了很多答案,但这个解释得很清楚!
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多