ASP.NET MVC应用程序结构

Nul*_*ter 0 asp.net-mvc asp.net-mvc-3

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

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

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

视图:

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

        CreateCategory

        DeleteCategory

        ManageCategory
Run Code Online (Sandbox Code Playgroud)

控制器:

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

        CreateCategory

        DeleteCategory

        ManageCategory
Run Code Online (Sandbox Code Playgroud)

型号:这是我怀疑的地方.我有一个名为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
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

nik*_*d23 6

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

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

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

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