我正在使用实体框架4.1和mvc3构建网站。我正在使用Generic Repository模式:
http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle。我使用ninject
将我的混凝土存储库注入控制器。
我的问题是我的每个dbcontext都不同,我不能运行复杂的查询而没有代码喊“不同的上下文不能在同一个查询中使用”。我尝试使用“单例”方法,但随后代码大喊“尝试输入已处置的对象(空引用异常)”。
有没有人知道我做错了什么?
答案 0 :(得分:1)
Singleton模式是一种应该避免的反模式。它导致难以测试具有各种副作用的代码(例如,处置的DbContext)。
UnitOfWork管理不同存储库的操作。它将跟踪所做的所有更改,然后将以正确的顺序将这些更改写入您的数据库。 DbContext已经实现了UnitOfWork模式(Altough它可以更好地隐藏自定义UnitOfWork接口背后的DbContext。)
如果你已经在NInject中使用依赖注入,那么你几乎就是他们的!您应该更改存储库的构造函数以获取DbContext:
public class MyRepository
{
private _unitOfWork;
public MyRepository(DbContext unitOfWork)
{
_unitOfWork = unitOfWork;
}
....
}
如果然后使用InRequestScope mode将DbContext连接到NInject,则一切都应该有效。然后,您的DbContext将由所有存储库共享,Ninject将在您请求结束时将其丢弃。
答案 1 :(得分:0)
不确定我是否收到您的问题,但您的存储库应该能够在具有单个dbcontext的“工作单元”中工作。
我发现启动此工作单元的最佳位置是在开始请求中,您可以在global.asax中设置(以及拆除的最终请求)