我遇到一个问题,即注入控制器的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的作用域生存期如何处理的根本误解。
答案 0 :(得分:0)
问题最终与我用来创建相关服务实例的静态类有关。
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类是静态的,因此我假设.net核心依赖关系解析器知道它包含的任何实例的生命周期都与请求不匹配,因此创建了一个新的DbContext实例供其使用。
将此类重构为不再是静态的即可解决此问题。