使用Generic Repository模式管理连接

时间:2012-05-03 11:55:41

标签: entity-framework-4.1 repository-pattern dbcontext

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

2 个答案:

答案 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中设置(以及拆除的最终请求)