.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 使其不再是静态的可解决问题。
我遇到一个问题,注入到控制器中的 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 使其不再是静态的可解决问题。