远离存储库模式。我应该如何使用DBContext?

时间:2014-09-09 16:42:47

标签: c# asp.net-mvc entity-framework

在MVC / Entity Framework项目中,我正在远离Repository模式。

首先,它给了我一些问题...... 我认为DBContext和IDBset类实现了UnitOfWork和Repository。

所以我开始使用命令和查询。这是一个例子:

public class ListPostsQuery {

  public ListPostsQuery() {
  }

  public List<Post> Execute(int currentPage, int pageSize) {

  }
}

如何在查询/命令中集成或注入DBContext?

也许使用带有Save方法的DBContext包装器并公开集合?

或者我应该在Execute方法中创建一个新的上下文?

  public List<Post> Execute(int currentPage, int pageSize) {

    using (Context = new DBContext) {
    }

  }

有人可以就此提出建议吗?

2 个答案:

答案 0 :(得分:3)

使用构造函数注入,即通过构造函数将上下文传递给服务类。

public class ListPostsQuery {

  private DbContext ctx;

  public ListPostsQuery( DbContext ctx ) {
     this.ctx = ctx;
  }

  public List<Post> Execute(int currentPage, int pageSize) {

     return ctx....

  }
}

这样您可以控制一次上下文的生命周期,例如:在控制器工厂或使用您选择的ioc框架。

答案 1 :(得分:2)

我会坚持

using (Context = new DBContext) 
{
}

原因是Context不是线程安全的,因此如果您尝试使用相同的上下文同时执行某些操作,则可能会导致数据出现一些非常糟糕的问题。

关于依赖注入:它肯定是很好的模式但是你在这里使用它的利润是多少?   - 你仍然与上下文紧密相连......   - 您将无法通过注入存根上下文来测试您的类...