【问题标题】:Is accessing database directly in the controller an antipattern?直接在控制器中访问数据库是一种反模式吗?
【发布时间】:2014-10-14 17:21:34
【问题描述】:

是:

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);

是否有一些我遗漏的一般规则? 还是取决于控制器内部逻辑的复杂性。 提前致谢。

【问题讨论】:

    标签: asp.net-mvc architecture abstraction


    【解决方案1】:

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

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

    【讨论】:

    • 另外,我认为它允许更好的测试(由于松散耦合,您可以模拟存储库等)
    【解决方案2】:

    这取决于很多因素,

    1. 你的应用是不是体积不是很小?
    2. 你打算只使用网站的逻辑吗?移动应用程序
    3. 什么会随着时间而改变?你要换存储吗?您是否要跨控制器操作使用相同的逻辑?
    4. 你打算用单元/集成测试来覆盖你的代码吗?

    如果所有这些问题的答案都是NO,则可以访问控制器中的数据库。否则考虑使用以下内容,具体取决于您的应用程序的共谋性

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 2017-08-06
      • 2013-11-17
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多