软件架构风格之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等等内容。

posted @   tuqunfu  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示