Mat*_*ano 1 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;
}
Run Code Online (Sandbox Code Playgroud)
其中 LpcContext 是 DbContext 类型。
我的问题是:由于我希望每个请求都有一个 DbContext,我还需要在 Simple Injector 中注册它吗?如果是这样,我如何实现这一目标?
如果LPCContext是具有单个构造函数的具体类型,从技术上讲,您不必注册它,因为 Simple Injector 可以为您自动创建它,并且由于它UnitOfWork是作为作用域创建的,因此它将沿着与LPCContext作用域相同的生活方式拖动好。然而...
Simple Injector 将使用瞬态生活方式为您自动注册一个具体的未注册类型。但是现在您的范围注册UnitOfWork取决于具有 shorer 生活方式(瞬态)的注册,Simple Injector 将抛出异常,解释存在Lifestyle Mismatch。
尽管在您的特定情况下,这不会成为问题,但解决问题仍然很重要,因为当您开始将 注入LPCContext其他消费者时,它很容易在以后导致问题。在这种情况下,每个消费者都会获得自己的LPCContext实例,这通常不是您想要的。
因此,要解决此问题,最好LPCContext使用范围生活方式明确注册该类:
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
container.Register<LPCContext>(() => new LPCContext(conString), Lifestyle.Scoped);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3273 次 |
| 最近记录: |