单位工作的简单喷油器和每个请求的EF DbContext
问题描述:
我正在使用UoW模式,并且我已经使用Simple Injector来进行依赖注入。 我已经注册了UOW类像container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
和UOW类的构造函数一样收到的DbContext:单位工作的简单喷油器和每个请求的EF DbContext
private readonly LPCContext _lpcContext;
public UnitOfWork(LPCContext lpcContext)
{
_lpcContext = lpcContext;
}
凡LpcContext是的DbContext类型。
我的问题是:因为我想每个请求都有一个DbContext,我是否还需要在Simple Injector中注册它?如果是这样,我该如何实现这一目标?
答
如果LPCContext
是一个具有单一构造函数的具体类型,从技术上讲,您不必注册它,因为简单注入器可以为您自动创建它,并且自UnitOfWork
创建为作用域,它将拖动所有的LPCContext
作为范围的生活方式。然而...
简单的注射器将自动注册一个具体的未注册类型为您使用瞬态生活。但现在您的范围注册UnitOfWork
取决于注册与岸上生活方式(短暂),简单注射器将抛出一个异常,解释有一个Lifestyle Mismatch。
尽管在您的特殊情况下这不会成为每个人看到的问题,但解决问题仍然很重要,因为当您开始向其他消费者注入LPCContext
时,它很容易导致问题出现。在这种情况下,每个消费者将获得自己的LPCContext
实例,这通常不是您想要的。
因此,要解决这个问题,最好明确使用范围化生活方式注册LPCContext
类:
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped);
这是我会怎么做。 谢谢@Steven。 – Maturano