gpt4 book ai didi

ASP.NET MVC - 在哪里放置数据库查询

转载 作者:行者123 更新时间:2023-12-04 12:32:13 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




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

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

基于此 ASP.NET tutorial ,我应该把它放在 Controller 中。但是,我发现了这个 StackOverflow question ,它说我应该把它放在模型中(类似于我以前在 PHP 中所做的)。关于创建包含所有查询的存储库模式/类提到的同一问题的另一个答案。

所以我的问题是,以下选项在代码维护(可读性、更改效果等)方面的优缺点是什么?
  • Controller 查询
  • 型号查询
  • 单独的类/层中的查询
  • 最佳答案

    使用存储库模式处理此问题的简单方法。这不是最好的方法。但是会让您了解如何使用存储库模式处理此问题。

    创建一个存储库来完成所有的数据库事务

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

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

    现在在您的 Controller 中,导入必要的命名空间后,只需创建存储库的对象并调用您感兴趣的方法
    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);
    }
    }
    }

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

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

    关于ASP.NET MVC - 在哪里放置数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143299/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com