哪些查询应放在ASP.NET MVC中

时间:2013-09-04 15:57:11

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

我正在使用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页 用户可以通过从Info System登录来输入website

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

6 个答案:

答案 0 :(得分:6)

您的问题是关于项目的基础设施,这取决于很多因素。

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

  

我计划将来在桌面应用程序中转换这个项目。

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

如果您有兴趣获取有关项目基础结构的更多信息,我建议您:Microsoft Spain - Domain Oriented N-Layered .NET 4.0 Sample App有详细记录,并为您提供生成企业级应用程序所需的大量信息。

答案 1 :(得分:4)

MVC背后的想法是 SEPARATION 。如果任何逻辑或数据访问都应该进入控制器,我不会想太多。我创建的大多数站点和应用程序最终都使用API​​项目,因此很容易将数据库访问权限放在那里。这最终取决于你,并归结为一个问题:我想要一个有组织的解决方案吗?

这是一个非常敏感的主题,但我通过我的经验发现,拥有一个更有条理的解决方案/项目将在以后更好地实践。由于您计划稍后转换为桌面应用程序,我强烈建议使用API​​将DAL移动到单独的项目中。这样,您只需编写代码一次

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

让我们说我在购物车场景中涉及以下步骤:

  1. 从数据库中获取购物车
  2. 计算税金
  3. 总计一切
  4. 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