我正在使用实体框架 4.1 和 mvc3 构建一个站点。我正在使用通用存储库模式:
http ://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle 。我ninject
用来将我的具体存储库注入控制器。我的问题是我的每个 dbcontext 都不同,如果没有代码喊出“不同的上下文不能在同一个查询中使用”之类的东西,我就无法运行复杂的查询。我尝试使用“单例”方法,但随后代码大喊“试图输入已处置的对象(空引用异常)”之类的东西。有谁知道我做错了什么?
问问题
917 次
2 回答
2
单例模式是一种应该避免的反模式。它导致难以测试具有各种副作用的代码(例如,已处置的 DbContext)。
UnitOfWork 管理不同存储库上的操作。它将跟踪所做的所有更改,然后以正确的顺序将这些更改写入您的数据库。DbContext 已经实现了 UnitOfWork 模式(尽管将 DbContext 隐藏在自定义 UnitOfWork 接口后面会更好)。
如果您已经通过 NInject 使用依赖注入,那么您几乎就是他们的了!您应该更改存储库的构造函数以采用 DbContext:
public class MyRepository
{
private _unitOfWork;
public MyRepository(DbContext unitOfWork)
{
_unitOfWork = unitOfWork;
}
....
}
如果您随后使用InRequestScope 模式将 DbContext 连接到 NInject,那么一切都应该正常工作。然后,您的 DbContext 将由所有存储库共享,并且 Ninject 将在您的请求结束时处理它。
于 2012-05-03T13:07:37.973 回答
0
不确定我是否收到您的问题,但是您的存储库应该能够在具有单个 dbcontext 的“工作单元”中工作。
我发现开始这个工作单元的最佳位置是在开始请求上,你可以在你的 global.asax 中设置它(以及结束的拆除请求)
于 2012-05-03T12:00:32.050 回答