每个请求的工作单元和 EF DbContext 的简单注入器
Simple Injector for Unit Of Work and EF DbContext per Request
我正在使用 UoW 模式,并且我使用简单注入器进行依赖注入。
我已经像 container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
一样注册了 UoW class 并且 UoW class 在构造函数中接收了一个 DbContext,例如:
private readonly LPCContext _lpcContext;
public UnitOfWork(LPCContext lpcContext)
{
_lpcContext = lpcContext;
}
其中 LpcContext 是 DbContext 类型。
我的问题是:因为我想每个请求都有一个 DbContext,我还需要在 Simple Injector 中注册它吗?如果是这样,我该如何实现?
如果 LPCContext
是一个具有单一构造函数的具体类型,从技术上讲,你不必注册它,因为 Simple Injector 可以为你自动创建它,并且由于 UnitOfWork
被创建为 scoped,它将沿 LPCContext
as scoped 生活方式拖动。然而...
Simple Injector 将使用 transient 生活方式为您自动注册一个具体的未注册类型。但是现在 UnitOfWork
的范围注册取决于具有更短生活方式的注册(瞬态),Simple Injector 将抛出异常,说明存在 Lifestyle Mismatch.
虽然在你的特定情况下这不是问题,但解决这个问题仍然很重要,因为它很容易导致以后的问题,当你开始将 LPCContext
注入其他消费者也是如此。在这种情况下,每个消费者都将获得自己的 LPCContext
实例,这通常不是您想要的。
所以要解决这个问题,最好使用 scoped 生活方式显式注册 LPCContext
class:
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped);
我正在使用 UoW 模式,并且我使用简单注入器进行依赖注入。
我已经像 container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
一样注册了 UoW class 并且 UoW class 在构造函数中接收了一个 DbContext,例如:
private readonly LPCContext _lpcContext;
public UnitOfWork(LPCContext lpcContext)
{
_lpcContext = lpcContext;
}
其中 LpcContext 是 DbContext 类型。
我的问题是:因为我想每个请求都有一个 DbContext,我还需要在 Simple Injector 中注册它吗?如果是这样,我该如何实现?
如果 LPCContext
是一个具有单一构造函数的具体类型,从技术上讲,你不必注册它,因为 Simple Injector 可以为你自动创建它,并且由于 UnitOfWork
被创建为 scoped,它将沿 LPCContext
as scoped 生活方式拖动。然而...
Simple Injector 将使用 transient 生活方式为您自动注册一个具体的未注册类型。但是现在 UnitOfWork
的范围注册取决于具有更短生活方式的注册(瞬态),Simple Injector 将抛出异常,说明存在 Lifestyle Mismatch.
虽然在你的特定情况下这不是问题,但解决这个问题仍然很重要,因为它很容易导致以后的问题,当你开始将 LPCContext
注入其他消费者也是如此。在这种情况下,每个消费者都将获得自己的 LPCContext
实例,这通常不是您想要的。
所以要解决这个问题,最好使用 scoped 生活方式显式注册 LPCContext
class:
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped);