ASP.NET MVC应用程序结构

时间:2011-10-10 17:03:11

标签: asp.net-mvc asp.net-mvc-3

我正在使用mysql数据库开发MVC应用程序。

我通过SO和其他网站搜索了很多关于架构/结构的信息。我发现了很多类似的问题,但我仍然有疑问。

在我的应用程序中有一个类别部分;结构如下所示:

查看:

类别 - (下面列出的类别文件夹中的视图)

        CreateCategory

        DeleteCategory

        ManageCategory

控制器:

CategoryController - (下面列出的动作名称)

        CreateCategory

        DeleteCategory

        ManageCategory

型号:这是我怀疑的地方。我有一个名为CategoryModels的模型,但我不知道我是否以正确的方式做事。我不知道应该把服务功能放在哪里 - 比如我把函数放在创建或删除类别的地方。

我所做的是在CategoryModel.cs中创建一个CategoryServices类并在其中编写函数。 DAL文件放在应用程序代码文件夹中,因此要访问数据库,该函数将创建一个DAL对象并调用它。这是正确的方法吗?

CategoryModels.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Web.Mvc;
using System.Web.Caching;

namespace TraktorumMVC.Models
{
    public class CategoryModels  // contain properties for the 3 views (CreateCategory,DeleteCategory and  ManageCategory
    {
          public IEnumerable<SelectListItem> CategoryList { get; set; }
          public IEnumerable<SelectListItem> AvailableCategories { get; set; }
           //etc..........
    }

    public class CategoryServices  // this class contain all service functions related to categories   
    {
       public int RemoveCategory(int categoryId) // this will remove a category
       {            
        int status = -1;
        try
        {
            string query = Resources.Queries.RemoveCategory;
            DAL objDAL = new DAL();               //DAL file is in Appcode folder. IS this right way
            string[] inParamNameArray = { "Id"};
            string[] inParamValueArray = { categoryId.ToString()};
            object[] inParamTypeArray = { DbType.Int32 };
            status =Convert.ToInt32( objDAL.ExecuteScalar(query, inParamNameArray, inParamValueArray, inParamTypeArray, true));               
        }
        catch (Exception ex)
        {
            DeveloperLog.WriteExceptionLog(ex, "CategoryServices.RemoveCategory");
        }

        return status;
      }

       public bool InsertCategory(int parentCategoryId, string icon, string name)
       {
        //bla bla
       }
    }
}

这是正确的方法吗?这打破了模型概念吗?

2 个答案:

答案 0 :(得分:6)

ASP.NET MVC中的“模型”并不是非常规范的,并且肯定比视图或控制器更少规范。

也就是说,你的模型并不一定是正确或错误的方式,但人们会采取一些流行/常用的方法:

  • 利用像Entity Framework(EF)或NHibernate这样的ORM作为您的模型。这在主要是CRUD驱动的简单站点上运行良好。在您的情况下,EF可以处理您需要对类别执行的所有CRUD工作。
  • 另一种常见方法是利用可能封装业务和数据访问逻辑的某种服务层。该层可能会返回您的应用程序数据传输对象 - 非常简单,仅限数据的容器 - 您可以更改并发回。
  • 无论哪种方式,将“视图模型”与“域模型”分开是个好主意。这方面的一个例子不是简单地将Entity Framework控制的对象传递给View进行渲染。相反,您将这些对象(以及可能的其他对象)映射到专门为该视图创建的“视图模型”中。帮助开发人员实现这一目标的流行工具是出色的http://automapper.org/

在您的情况下,如果可以的话,我建议使用ORM来处理类别的持久性。如果您当前的DAL不仅仅是持久性,那么我建议您将其分离到具有相应接口的服务,您的控制器可以获取对该应用程序的引用并用于推动您的应用程序。

答案 1 :(得分:1)

这里没有Category模型,你拥有的是某些视图特定部分的视图模型。正如@ n​​ikmd23所暗示的那样,您可能希望将视图模型和域模型分开。域模型可以描述构成系统的数据。视图模型描述了您希望如何通过接口共享数据。

在这种情况下,首先要创建一个域模型,例如:

public class Category
{
    public string Name { get; set; }
    public int Id { get; set; }
}

然后,您的DAL包含一些用于获取Category个对象集合的功能:

public interface DAL
{
    IEnumerable<Category> GetCategories();
}

当您想要构建类别的视图模型时,您可以将其映射到视图模型:

var dal = new DALImplementation();
var categories = dal.GetCategories();
var categoryListViewModel = categories.Select(m => new SelectListItem 
{ 
    Text = m.Name, 
    Value = m.Id.ToString() 
});

每个步骤都有许多不同的实现模式,但整个想法是从创建域模型开始,然后构建服务以与这些域模型交互,并为每个带有视图的请求构建视图模型,仅显示您要与用户分享的确切信息。