工作单元的简单注入器和每个请求的EF DbContext

时间:2015-09-25 14:10:09

标签: c# asp.net-mvc entity-framework simple-injector

我正在使用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中注册吗?如果是这样,我该如何做到这一点?

1 个答案:

答案 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);