2015-09-25 74 views
0

我正在使用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中注册它?如果是这样,我该如何实现这一目标?

回答

4

如果LPCContext是一个具有单一构造函数的具体类型,从技术上讲,您不必注册它,因为简单注入器可以为您自动创建它,并且自UnitOfWork创建为作用域,它将拖动所有的LPCContext作为范围的生活方式。然而...

简单的注射器将自动注册一个具体的未注册类型为您使用瞬态生活。但现在您的范围注册UnitOfWork取决于注册与岸上生活方式(短暂),简单注射器将抛出一个异常,解释有一个Lifestyle Mismatch

尽管在您的特殊情况下这不会成为每个人看到的问题,但解决问题仍然很重要,因为当您开始向其他消费者注入LPCContext时,它很容易导致问题出现。在这种情况下,每个消费者将获得自己的LPCContext实例,这通常不是您想要的。

因此,要解决这个问题,最好明确使用范围化生活方式注册LPCContext类:

string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped); 
+0

这是我会怎么做。 谢谢@Steven。 – Maturano

相关问题