我正在使用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
}
}
}
这是正确的方法吗?这打破了模型概念吗?
答案 0 :(得分:6)
ASP.NET MVC中的“模型”并不是非常规范的,并且肯定比视图或控制器更少规范。
也就是说,你的模型并不一定是正确或错误的方式,但人们会采取一些流行/常用的方法:
在您的情况下,如果可以的话,我建议使用ORM来处理类别的持久性。如果您当前的DAL不仅仅是持久性,那么我建议您将其分离到具有相应接口的服务,您的控制器可以获取对该应用程序的引用并用于推动您的应用程序。
答案 1 :(得分:1)
这里没有Category
模型,你拥有的是某些视图特定部分的视图模型。正如@ nikmd23所暗示的那样,您可能希望将视图模型和域模型分开。域模型可以描述构成系统的数据。视图模型描述了您希望如何通过接口共享数据。
在这种情况下,首先要创建一个域模型,例如:
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()
});
每个步骤都有许多不同的实现模式,但整个想法是从创建域模型开始,然后构建服务以与这些域模型交互,并为每个带有视图的请求构建视图模型,仅显示您要与用户分享的确切信息。