1

我正在使用实体框架 4.1 和 mvc3 构建一个站点。我正在使用通用存储库模式:
http ://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle 。我ninject用来将我的具体存储库注入控制器。我的问题是我的每个 dbcontext 都不同,如果没有代码喊出“不同的上下文不能在同一个查询中使用”之类的东西,我就无法运行复杂的查询。我尝试使用“单例”方法,但随后代码大喊“试图输入已处置的对象(空引用异常)”之类的东西。有谁知道我做错了什么?

4

2 回答 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 回答