.NET Core DbContext 依赖解析范围

.NET Core DbContext Dependency Resolution Scope

我遇到一个问题,注入到控制器中的 DbContext 实例与注入到服务中的实例不同。

下面是我的 DbContext 注册:

services.AddDbContext<CRMContext>();
services.AddScoped<IEstimateRepository, EstimateRepository>();
services.AddScoped<IMaterialRecordRepository, MaterialRecordRepository>();

我的理解是,默认情况下,AddDbContext 将上下文添加为 Scoped,因此我希望控制器和服务共享同一个实例。

作为参考,这里是控制器构造函数和服务:

public LineItemController(IEstimateRepository repository)
{
        _estimateRepository = repository;
}

public VentChuteLineItemRequiredEventHandler(IEstimateRepository estimateRepository, IMaterialRecordRepository materialRepository)
        {
            _materialRepository = materialRepository;
            _estimateRepository = estimateRepository;
        }

我也在这个应用程序中使用 Autofac,但据我所知,它与手头的问题没有任何关系。这似乎只是我对如何处理 DbContext 的作用域生命周期的根本误解。

问题最终与我用来创建相关服务实例的静态 class 有关。

public static class DomainEventHandler
{
    public static ILifetimeScope _container { get; set; }

    public static void Raise<T>(T args) where T : IDomainEvent
    {
        foreach (var handler in _container.Resolve<IEnumerable<IHandle<T>>>())
        {
            handler.Handle(args);
        }
    }
}

由于 DomainEventHandler class 是静态的,我假设 .net 核心依赖解析器知道它包含的任何实例的生命周期与请求不匹配,因此创建了一个新的 DbContext 实例供其使用.

重构此 class 使其不再是静态的可解决问题。