ASP.NET MVC中应放置查询的位置

本文关键字:查询 位置 NET MVC ASP | 更新日期: 2023-09-27 18:30:13

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

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

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

进一步信息:
我使用的是简单的查询方法,而不是LinqEntity Framework
我计划将来也将这个项目转换为Desktop Application

另一个问题是,如果我使用business Logic,它在ASP.NET MVC中是如何工作的?

关于项目的详细信息
它是一家公司的Website+Online Information System,两者都有大约40-50页
用户可以通过从website登录进入Info System

在投票结束之前留下评论,这样我就可以学到一些东西。

ASP.NET MVC中应放置查询的位置

您的问题是关于一个依赖于许多因素的项目的基础设施。

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

我有一个计划,也转换这个项目在桌面应用程序在未来。

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

如果您有兴趣获得有关项目基础设施的更多信息,我建议您:Microsoft Spain-Domain Oriented N-Layered.NET 4.0示例应用程序,该应用程序文档齐全,可为您提供制作企业级应用程序所需的大量信息。

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

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

我认为没有必须遵守的规则。每个人都有自己的方法。在我的应用程序中,我正在创建带有静态助手类的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);
}

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

到目前为止,在我的所有工作中,我们都创建了一个单独的DAL项目来放入我们所有的数据库调用。但我的意思是,我认为这实际上只是为了组织和保持独立。如果这是一个较小的项目,我想把它放在一个单独的班级里就可以了。不过,我不确定模型中的内容,对我来说没有意义。

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

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

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

项目.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

项目.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);
   }
}

项目.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