使用通用存储库模式管理连接



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

单例模式是应避免的反模式。它导致难以测试具有各种副作用的代码(例如,已释放的 DbContext)。

工作单元管理不同存储库上的操作。它将跟踪所做的所有更改,然后以正确的顺序将这些更改写入您的数据库。DbContext 已经实现了 UnitOfWork 模式(尽管将 DbContext 隐藏在自定义 UnitOfWork 接口后面会更好)。

如果您已经在使用依赖注入,那么您几乎就是他们的了!您应该更改存储库的构造函数以采用 DbContext:

public class MyRepository
{
   private _unitOfWork;
   public MyRepository(DbContext unitOfWork)
   {
      _unitOfWork = unitOfWork;
   }
   ....
}

如果随后使用 InRequestScope 模式将 DbContext 连接到 NInject,则一切正常。然后,您的 DbContext 将由所有存储库共享,Ninject 将在您的请求结束时处理它。

不确定我是否收到您的问题,但是您的存储库应该能够在具有单个数据库上下文的"工作单元"中工作。

我发现开始这个工作单元的最佳位置是开始请求,您可以在 global.asax 中设置它(以及拆除的结束请求)

最新更新