2012-05-03 23 views
1

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

回答

1

的Singleton模式是一种抗应该避免的模式。它导致很难测试具有各种副作用的代码(例如,处置DbContext)。

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

如果你已经在使用依赖注入槽NInject,你几乎是他们的!你应该改变你的版本库的构造采取的DbContext:

public class MyRepository 
{ 
    private _unitOfWork; 

    public MyRepository(DbContext unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    .... 
} 

如果然后用InRequestScope mode就可以工作了接线的DbContext到NInject。您的DbContext将由所有存储库共享,Ninject将在请求结束时处理它。

+0

你的意思是我的仓库的构造函数应该得到一个dbContext,ninject会知道自动注入dbcontext在控制器中调用存储库类时? –

+0

加上,我正在使用本文中看到的通用存储库:http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle如何我可以在那里使用存储库构造器吗? –

+0

是的。我的意思是你的Repository上的构造函数应该接受一个dbContext。如果你然后使用NInject注入一个带有InRequestScope的dbContext(这意味着每个请求将有一个共享的dbContext),那么它应该工作。据我所见,GenericRepository应该被修改为在其构造函数中使用dbContext,而不是为每个存储库创建一个。 –

0

不知道我是否收到您的问题,但您的存储库应该能够在“工作单元”内工作,该工作单元将具有单个dbcontext。

我觉得开始工作的这个单元的最佳位置是在开始请求时,您可以在您的Global.asax设置(和推倒结束请求)

+0

“工作单元”是我还没有尝试过的东西。你能告诉我为什么当试图使用“single Ton”模式时,我得到了一个空引用(试图访问一个处置对象) –