数据库查询的位置

我正在尝试学习ASP.NET MVC 4,并且对于应该在哪里放置数据库查询感到困惑。 我有PHP的背景,特别是CodeIgniter,我习惯于将所有db查询放入模型中。 我有这个查询:

    db.Orders.Where(order => order.columnName == columnName).SingleOrDefault();

基于这个ASP.NET教程,我应该把它放在控制器中。 然而,我发现这个StackOverflow问题,它说我应该把它放在模型中(类似于我在PHP中所做的)。 对同一问题的另一个答案提到了创建包含所有查询的存储库模式/类。

所以我的问题是,以下选项在代码维护(可读性,更改效果等)方面有哪些优缺点?

  • 在控制器中查询
  • 查询模型
  • 在单独的课程/图层中查询

  • 使用存储库模式处理此问题的简单方法。 这不是最好的办法。 但会给你一个想法,你可以如何处理与存储库模式。

    创建一个存储库来执行所有的db事务

    public interface IRepository
    {
      Order GetOrder(int orderId);
    }
    public class Repository : IRepository
    {
       YourDBContext db;
       public Repository()
       {
          db = new YourDBContext ();
       }
       public User GetOrder(int orderId)
       {
          return db.Orders.FirstOrDefault(s=>s.OrderID==orderId);
       }
    }
    

    您可以在同一个项目中创建它(在“数据访问逻辑”下)或为此创建一个单独的类库(并将其引用到您使用它的任何位置)。

    现在在您的控制器中,导入必要的命名空间后,只需创建存储库的对象并调用您感兴趣的方法即可

    public OrderController :Controller
    {
      protected IRepository repo;
      public OrderController()
      {
        repo=new Repository();
      }
      public OrderController(IRepository repositary)
      {
        // This constructor is for your Unit test project, 
        // you can pass a mock repository here
        // Read dependency injection
        repo=repository;
      }
      public ActionResult details(int id)
      {
        var order=repo.GetOrder(id);
        if(order!=null)
        {
          return View(order);
        }
      }
    }
    

    如果您认为您的视图需要,您可以考虑使用视图模型。 在这种情况下,您需要从您的域对象读取属性值并将其设置为您的视图模型的实例并将其返回到您的视图。

    随着代码/功能的增长,您可以将代码移动到不同的类/图层/项目中。


    从我的角度来看,MVC中所谓的模型不是数据库的模型,而是具有创建视图所需的所有信息的类。 这意味着该类与数据库完全断开,并且具有不同信息的不同结构。

    控制器必须验证输入条件(请求的参数)将其发送给检索信息的类(如果您愿意,可将其称为存储库),获取数据并将其移入模型中。

    当然,如果你想将查询添加到控制器中,但是测试控制器会更困难。 使用其他方法可能会更容易(您可以模拟存储库的类/接口并且您已准备就绪)。

    Byez .u

    链接地址: http://www.djcxy.com/p/76961.html

    上一篇: Where to put database queries

    下一篇: Angular $sce vs HTML in external locale files