【问题标题】:Where queries should be placed in ASP.NET MVC应该在 ASP.NET MVC 中放置查询的位置
【发布时间】:2013-09-08 05:44:03
【问题描述】:

我正在使用 ASP.NET MVC,使用 Framework 4.0 和 SQL Server 2008 构建 ERP。
我的问题是查询应该放在哪里?我在冲浪时看到了多种方法。其中少数如下:

  • Models
  • Separate Files 中,位于 DAL 文件夹中
  • Separate DAL项目中

经过研究,我仍然对在 Models 中使用查询感到困惑。

更多信息:
我使用的是简单的查询方法,而不是LinqEntity Framework
我计划将来也将此项目转换为Desktop Application

另一个问题是如果我使用business LogicASP.NET MVC 中的工作原理是什么?

项目详情
这是一家公司的Website + Online Information System,两者都有大约 40-50 页。
用户可以通过website登录进入Info System

在投票结束之前发表评论,以便我可以学到一些东西。

【问题讨论】:

  • 您正在尝试选择一种架构,除非您提供有关您的应用程序、要求等的更多信息,否则无法回答。
  • 好吧,我忘记了应用程序详细信息。我更新了

标签: c# asp.net asp.net-mvc asp.net-mvc-4 n-tier-architecture


【解决方案1】:

您的问题是关于取决于许多因素的项目的基础架构。

考虑到您在问题中提供的信息:

我计划将来也将此项目转换为桌面应用程序。

为了可用性起见,您应该将Data Access Layer 放在一个单独的项目中。

如果您有兴趣获得有关项目基础架构的更多信息,我向您推荐:Microsoft Spain - Domain Oriented N-Layered .NET 4.0 Sample App,它有详细的文档记录,并为您提供了制作企业级应用程序所需的大量信息。

【讨论】:

    【解决方案2】:

    假设我在购物车场景中,涉及以下步骤:

    1. 从数据库中获取购物车
    2. 计算税金
    3. 一应俱全

    Project.Core(拥有所有领域类)

    public CartItem
    {
       public int Id { get; set; }
       public string Desc { get; set; }
    }
    
    public CartDetails
    {
       public int Id { get; set; }
       public List<CartItem> CartItems { get; set; }
       public Decimal Tax { get; set; }
       public Decimal Total { get; set; }
    }
    

    Project.DAL

    public class CartDAL  
    {
      public List<CartItem> GetCart(int cartId)
      {
         //execute sql here, get datareader or datatable
         //loop thru the rows and mait into a List<CartItem>
    
         return List<CartItem>
      }
    }
    

    查看 Dapper 或 Massive,而不是像上面那样手动。

    http://code.google.com/p/dapper-dot-net/

    https://github.com/robconery/massive

    Project.BLL

    public class CartBLL
    {     
      CartDAL cartDAL = new CartDAL();
      public CartDetails GetCartDetails(int cartId)
      {
         var cartDetails = new CartDetails();
         cartDetails.CartItems = cartDAL.GetCart(cartId);
         cartDetails.Tax = cartDAL.GetCart(cartId);
         cartDetails.Total = cartDAL.GetCart(cartId); 
         return cartDetails;
      }
    }
    

    Project.Web

    public class CartController
    {
       CartBLL cartBLL = new CartBLL();
       public ActionResult Index(int Id)
       {
           var cartDetails = cartBLL.GetCartDetails(Id);
    
           // Make a cartViewModel
    
           View(cartViewModel);
       }
    }
    

    Project.WPF

    //Nothing much changes in desktop comapared to Web, just call the BLL stuff and you are set
    CartBLL cartBLL = new CartBLL();
    var cartDetails = cartBLL.GetCartDetails(Id);
    //Populate view
    

    所以,基本上你必须在所有前端项目中重用你的 BLL

    【讨论】:

    • BLL 不应引用 DAL。通常我在 BLL 中定义业务实体(我认为它们属于那里),并从 DAL 中引用 BLL。 BLL 还包含用于抽象存储库/上下文/...的接口,而 DAL 实现了一个接口,并使用一些 DI 将它们粘合在一起。
    • 我同意,当他似乎刚刚开始时,我不想将 OP 与诸如 DI 之类的复杂问题混淆。
    【解决方案3】:

    您可以创建一个 DAL 文件夹,或者您可以创建一个单独的 DAL 项目来编写您的数据访问代码

    【讨论】:

      【解决方案4】:

      MVC 背后的理念是分离。如果任何逻辑或数据访问都应该进入控制器,我不认为太多。我创建的大多数站点和应用程序最终都使用 API 项目,因此很容易将数据库访问权限投入其中。这最终取决于您,归结为一个问题:我想要一个有组织的解决方案吗?

      对于大多数人来说,这是一个敏感的话题,但根据我的经验,我发现拥有一个更有条理的解决方案/项目将有助于以后进行更好的实践。由于您计划稍后转换为桌面应用程序,因此我强烈建议您使用 API 将 DAL 移动到单独的项目中。这样您只需编写代码一次

      【讨论】:

      • 在做小型项目时,将DataAccess保留在Model中是否是例行公事
      • 你说“逻辑或数据访问不应该进入控制器”我想了解模型。
      • @syedmohsin 我会避免将数据访问放在模型中。他们通常负责表示数据,而不负责获取或发送数据。
      【解决方案5】:

      到目前为止,在我所有的工作中,我们创建了一个单独的 DAL 项目来放置我们所有的数据库调用。但我的意思是,我认为它真的只是为了组织和保持分离。如果它是一个较小的项目,我认为将它放在一个单独的类中就可以了。我不确定模型中的内容,但对我来说没有意义。

      【讨论】:

        【解决方案6】:

        我认为没有必须做的规则。每个人都有自己的方法。在我的应用程序中,我正在使用静态帮助程序类创建 Helpers 文件夹。比如创建class DBLogic:

        public static class DBLogic
        {
           public static List<Clients> GetAllClient()
           {
             //**your query here
              return //**some result
            }
        }
        

        比在控制器中,当您需要客户端列表时

        public ActionResult Index()
        {
          var clients = DBLogic.GetAllClient()
        
          return View(clients);
        }
        

        这是我的方法。对我来说足够合乎逻辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多