是否直接在控制器中访问数据库的反模式?

时间:2014-10-14 17:21:34

标签: asp.net-mvc architecture abstraction

时:

public ActionResult Whatever(int id) `
{
  using (var db = new Context()) 
  {
     var result = db.Whatevers.Where(x => x.Id == id);
     // ....
  }
}
糟糕的做法,我应该倾向于像某种存储库那样添加抽象层(例如实现接口)?

类似的东西:

var repo = new MyRepository(db) // context created earlier
var result = repo.GetWhatever(id);

是否有一些我失踪的一般规则? 或者它取决于控制器内部逻辑的复杂性。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

是的,将数据库交互抽象到单独的层中通常是一种很好的做法。始终通过接口访问资源并使用依赖注入在运行时解析这些对象的实例也是一种好习惯。

对此没有严格的规定,但在专业环境中,没有人会在控制器中创建具有数据访问逻辑的应用程序。

答案 1 :(得分:1)

这取决于很多因素,

  1. 您的应用程序的大小是不是很小?
  2. 您是否只会使用网站逻辑?移动应用程序
  3. 什么会及时改变?你打算改变存储吗?您是否要在控制器操作中使用相同的逻辑?
  4. 您是否打算使用单元/集成测试来覆盖您的代码?
  5. 如果所有这些问题的答案都是,那么访问控制器中的数据库就行了。否则,请考虑使用以下内容,具体取决于您的应用程序的共谋

    1. Dependency injection
    2. IOC容器,例如Autofac
    3. Repository pattern
    4. Unit of work pattern