软件架构风格之MVC架构
一、前言
在序章中已经介绍了MVC架构,MVC即模型-视图-控制器模式,该架构的核心组件是模型(Model)、视图(View)、控制器(Controller),各个部件之间职责明确,以实现搞内聚低耦合的系统。Model层的作用和职责①表示应用程序的数据结构和业务逻辑;②包含用于访问、更改和保存数据的方法;③负责与数据库、文件系统和其它数据源的交互,获取所需数据。View层的定义和作用①用户界面的展示部分,负责向用户呈现数据并接收用户的输入数据;②包含UI元素如文本框、按钮、下拉列表、表格、统计图形等;③View依据Controller传递回来数据更新视图,但是不涉及业务逻辑。Controller层的职责和工作流程①充当Model和View的中介,处理用户输入并更新Model和View;②负责接收用户的请求,调用相关方法处理请求,然后更新Model并选择合适View进行展示;③通过将Model数据传递给View来更新界面,同时还可以从View获取用户输入数据并反馈给Model。
二、实践
通过一个ASP.NET MVC框架来构建一个Demo,对上述描述的架构模式在实际项目中的使用方式。ASP.NET MVC是.NET平台下基于MVC设计模式构建的WEB项目模板,JAVA如Spring MVC。在VS环境中选择ASP.NET MVC创建项目,其项目的解决方案的项目结构如下。
ASP.NET MVC项目的目录结构和文件组织,Models文件夹用户存放应用程序的数据模型类,通常是与数据库表对应的实体类(DO)、VO、DTO。Views文件夹是应用程序的用户界面包括HTML/JS/CSS。Controllers文件夹是处理用户请求并响应用户的控制类。ASP.NET MVC除上述文件夹的视图页面、控制类、模型类,还包括其它组件如控制基类(基础方法属性、请求信息等等)、路由配置类、HTML帮助类、验证规则类、视图引擎类ViewEngine(Razor),上述组件一起给ASP.NET MVC框架提供了丰富的功能和组件,是开发人员能构建灵活、易扩展和已维护的WEB应用程序。
1、视图(Views)包含用户界面(cshtml、js、css、html),母版页(左侧、底部、顶部)、公共弹窗页、公共下拉组件页等。视图是呈现给用户使用,并且与用户进行交互,提交请求给控制类,返回处理的数据重新渲染视图。以学生信息为例,创建Views文件夹下创建Student文件夹存放Student业务的页面,创建Index.cshtml视图,内容如下。
@{ ViewData["Title"] = "Student Page"; } @model MVCArchitecture.Models.Student <!DOCTYPE html> <html> <head> <title>Student Information</title> </head> <body> <h1>Student Information</h1> <p>ID: @Model.Id</p> <p>Name: @Model.Name</p> <p>Age: @Model.Email</p> </body> </html>
2、控制器(Controllers)包含业务控制器,每一个控制类继承Controller基类,基类提供多样的返回结果集的方法、模型数据传输方法、文件返回的方法、请求上下文、请求的状态、路由跳转、权限验证等常用功能,提供丰富的方法和属性,减少控制类的编写。在Controllers文件夹下创建StudentController类,负责Student业务请求的接收和返回给视图,内容如下。
using Microsoft.AspNetCore.Mvc; using MVCArchitecture.Models; namespace MVCArchitecture.Controllers { /// <summary> /// /// </summary> public class StudentController : Controller { private readonly StudentModel _studentModel = new StudentModel(); [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Index() { Student student = _studentModel.GetStudent(1); return View(student); } } }
3、模型(Models)包含各业务模型类,业务模型负责业务逻辑处理、数据检验、与数据源交互查询更新数据。所以模型是核心,业务的业务逻辑、业务规则、验证规则、业务流程都是在模型层实现。在Models文件夹下创建Student类和StudentModel类,Student类是实体类对应数据库的表字段信息、StudentModel是模型包括实体的处理逻辑、与数据库的交互类,内容如下。
using MVCArchitecture.Repository; namespace MVCArchitecture.Models { /// <summary> /// 学生实体(属性) /// </summary> public class Student { /// <summary> /// id /// </summary> public int Id { get; set; } /// <summary> /// Name /// </summary> public string Name { get; set; } /// <summary> /// Email /// </summary> public string Email { get; set; } /// <summary> /// Phone /// </summary> public string Phone { get; set; } /// <summary> /// Password /// </summary> public string Password { get; set; } /// <summary> /// Gender /// </summary> public string Gender { get; set; } /// <summary> /// Status /// </summary> public int Status { get; set; } } /// <summary> /// 学生模型(属性+行为) /// </summary> public class StudentModel { private StudentRepository studentRepository = new StudentRepository(); public Student GetStudent(int id) { return studentRepository.GetOne(id); } } }
4、上述是模型-视图-控制器代码,系统还包括其他基础设施如帮助类、数据持久化的仓储类、SQL帮助类等在Infrastructure类库中,完成整个MVC的架构的项目。
5、MVC架构与三层架构的对比,两者都是软件工程的架构,只是不同角度对软件工程的抽象,MVC是基于关注分离,强调视图和数据的分离,数据展示和数据处理的分开,控制器是中介桥梁的作用对两者组合。三层架构是强调不同维度数据处理的高内聚低耦合,将交互界面、业务处理、数据处理分开。
三、总结
上述MVC架构的Demo,简单介绍各个组件的使用,具体实际项目涉及到权限、复杂的业务逻辑、模型之间的交互、复杂的业务规则,ASP.NET MVC框架的WEB项目模板提供丰富可重用的功能,清晰的代码结构。在实际项目中Model层不是简单实体类,还会包括控制类,边界类等,所以会对Model在进行层次的划分或者设计如service、domain等等内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?