我正在使用UoW模式,我使用Simple Injector来进行依赖注入。
我注册了UoW类,如container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
,UoW类在构造函数中接收DbContext,如:
private readonly LPCContext _lpcContext;
public UnitOfWork(LPCContext lpcContext)
{
_lpcContext = lpcContext;
}
其中LpcContext是DbContext类型。
我的问题是:由于我希望每个请求都有一个DbContext,我还需要在Simple Injector中注册吗?如果是这样,我该如何做到这一点?
答案 0 :(得分:4)
如果LPCContext
是具有单个构造函数的具体类型,从技术上讲,您不必注册它,因为Simple Injector可以为您自动创建它,并且因为{{1} }创建为作用域,它将拖动UnitOfWork
作为范围生活方式。然而...
Simple Injector将使用瞬态生活方式为您自动注册具体的未注册类型。但是现在你的LPCContext
的范围注册取决于注册海岸生活方式(瞬态),Simple Injector将抛出异常,解释有Lifestyle Mismatch。
虽然在您的特定情况下,每次查看都不会有问题,但解决问题仍然很重要,因为当您开始将UnitOfWork
注入LPCContext
时很容易导致问题其他消费者也是如此。在这种情况下,每个消费者将获得自己的LPCContext
实例,这通常不是您想要的。
因此,要解决此问题,最好使用范围生活方式明确注册LPCContext
课程:
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped);