三层架构、MVC、前后分离的一些知识

2023-11-15

三层架构模型

三层架构为:UI(表现层)、BLL(业务逻辑层)、DAL(数据访问层),此外还有一个必不可少的Entity(实体层)

其中

Entity实体层,与数据库相对应,主要存放数据库字段。

DAL数据访问层,主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作。

BLL业务逻辑层,是UI和DAL之间的桥梁,主要负责实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

UI表现层即用户界面。用于接收用户输入的数据和显示处理后用户需要的数据。

UI发用用户请求到BLL,BLL传递请求到DAL,DAL反馈回数据,并通过BLL传递给UI。

Entity在这三层架构中的作用:

  1. 实现面向对象思想中的"封装"
  2. 贯穿于三层之间,来连接三层
  3. 每一层(UI>BLL>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。

MVC模式

MVC架构是一种开发模式,与三层架构不是一个类型的概念。如果将MVC模式和三层架构关联起来看的话,可以理解为MVC是三层架构的UI层。MVC 模式把三层架构中的 UI 层再度进行了分化,分成了控制器、视图、模型三个部分。

  • 模型(Model):需要显示给页面的数据模型。
  • 视图(View):页面本身。
  • 控制器(Controller):就是完成页面逻辑,即获取页面数据和显示的页面视图,并进行页面渲染为最终展示效果。

三层架构与 MVC 架构区别

  • 三层架构是基于业务逻辑来划分的,而 MVC 架构是基于页面来划分的
  • 三层架构是采用分层的设计思想,而 MVC 架构不是分层而是按照职责划分的
  • 三层架构主要用于软件体系架构,MVC 架构主要用于表现层

前后端分离开发时的变化

当项目前后端分离时,从MVC的角度理解,MVC中的V(View)和C(Controller)便不存在了。原先一个项目便分成了两个项目,后端项目通过webapi提供数据服务,前端项目通过后端提供的服务获取数据并进行页面渲染。

分离出来后,前端通常也会有自己的开发模式,常用MVVM模式。即Model-View-ViewModel。

后端中,原MVC中的Model层设计思想还是可以用,然后在此只是增加一个Service层,给前端项目通过提供webapi提供数据服务。

一个前后端分离项目的分层

前端

MVVM

以下是WPF项目关于MVVM的一些思想,web前端项目后面学习补充。

MVVM 模式中有三个核心组件:模型、视图和视图模型。 每个组件的用途不同。

image-20230312204440640

在MVVM的设计思想下,ViewModel将View与Model隔离,并允许Model独立于试图进行演变。

使用 MVVM 模式的好处如下:

  • 如果现有模型实现封装了现有业务逻辑,则更改它可能很困难或有风险。 在此场景中,视图模型充当模型类的适配器,并阻止你对模型代码进行重大更改。
  • 开发人员可以在不使用视图的情况下为视图模型和模型创建单元测试。 视图模型的单元测试可以执行与视图使用的完全相同的功能。
  • 无需接触视图模型和模型代码即可重新设计应用 UI,前提是视图完全在 XAML 或 C# 中实现。 因此,新版本的视图应与现有视图模型一起使用。
  • 在开发过程中,设计人员和开发人员可以独立和并发地处理其组件。 设计人员可以专注于视图,而开发人员可以处理视图模型和模型组件。

后端

Service层

后端给前端提供具体的WebApi服务,主要有以下的几个作用:

  1. 将业务逻辑层进行封装,对外提供业务服务调用。
  2. 通过外观模式,屏蔽业务逻辑内部方法。
  3. 降低业务逻辑层与UI层的依赖,业务逻辑接口或实现的变化不会影像UI层。
  4. 降低UI层调用的请求次数及数据往返。

Model层

需要显示给页面的数据模型,即常用的DTO层。

在实际的业务场景下,后端实现或存储的数据远比用户需要的数据要庞大和复杂,所以前端需要的数据相对来说要么是组合的,要么是抽取的,不是完整的,因为在设计数据存储格式上都会有一些额外的设计和考虑,便产生了DTO层。

DTO(数据传输对象层),该层负责屏蔽后端的实体层,将UI层需要的数据进行重新的定义和封装。

前端的UI层,只是知道DTO的存在,同时前端需要的数据都在一个DTO中,这样,每次调用服务层的时候,只需要调用一次就可以完成所有的业务逻辑操作,而不是原来的直接调用业务逻辑层那样的,需要调用多次,对于分布式场景下,减少服务调用的次数,尤其重要。

在实际开发中,常会将DTO与Entity做一一对应映射,需要关联多个表视图时,会自己另外创建Model来定义新的数据模型。

Mapper映射

将DTO和Entity之间相互映射,一方更改,另一方同步。

DTO与前端打交道,前端也只知道DTO,不知道Entity和数据库;

Entity和数据库打交道,数据库只知道Entity,不知道DTO和前端。

所以增加DTO和Entity之间的映射,否则前端和DTO数据变化时,无法通知到数据库,数据库数据变更时,无法通知到前端。

BLL业务逻辑层

DAL数据访问层

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三层架构、MVC、前后分离的一些知识 的相关文章

随机推荐

  • FASTAI and Fine-Tuning BERT with FastAI

    这是一篇笔记类型文章 主要是从新学习一下fastai 和实践 pytorch pretrained BERT 和 pytorch transformers 对接fastai 后简洁快速实现bert模型的训练和执行任务 我还是一个小白 大佬看
  • python Elasticsearch 排序

    sort 与query是同级的 Elasticsearch python sort sort score order desc query function score query match all script score lang p
  • 接口报错之number值过大问题

    number的最大的值为2的53次方 9007199254740992 16位 当你传入的参数为Number类型时候超过16位 js就识别不了 接口会出现错误的情况 可以直接改成字符串就好了 1 JavaScript中所有的数字 无论是整数
  • 合工大 编译原理 实验二 LL1 自动生成M[A,a]

    实验目的 通过完成预测分析法的语法分析程序 了解预测分析法和递归子程序法的区 别和联系 使学生了解语法分析的功能 掌握语法分析程序设计的原理和构造方 法 训练学生掌握开发应用程序的基本方法 有利于提高学生的专业素质 为培 养适应社会多方面需
  • C++ *和&

    简单理解 是指向内存的地址变量 是取变量的地址 介绍参见 https www cnblogs com mr stn p 9037773 html简介
  • spring boot项目显示3行日志错误,内置tomcat不可使用

    spring boot项目显示3行日志错误 内置tomcat不可使用 首先这中错误是只显示三行 第一种方法是没有用spring boot starter web 在pom中将这个依赖放在第一个 第二种方法是继承ServletInitiali
  • 详解如何将python3.6软件的py文件打包成exe程序

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了详解如何将python3 6软件的py文件打包成exe程序 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 在我们完成一个Py
  • Codeforces Round 867 (Div. 3)(A题到E题)

    链接 Dashboard Codeforces Round 867 Div 3 Codeforces 头一次div3做出来四题 第五题也差临门一脚 赛后看到别人e题跟自己几乎一样的思路肠悔青了 还得练才行 A TubeTube Feed 签
  • 网络系列--如何理解网络“软化”?简要整理分析网络软化的赋能技术。

    文章目录 对网络软化的理解 SDN NFV NFV与SDN简单对比 如何理解网络 软化 简要整理分析网络软化的赋能技术 对网络软化的理解 在互联网飞速发展的今天 通信网络规模爆发式的增长以及客户对网络性能需求的多样性 对网络的灵活性和敏捷性
  • 【0day】复现时空智友企业流程化管控系统SQL注入漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞描
  • cocos2d-x实例学习(8)之CCJumpTo和CCJumpBy

    CCJumpTo和CCJumpBy概念 CCJumpTo 把某一CCSprite跳到某一位置 CCJumpBy 把某一CCSprite跳起一段距离 它有一个方法reverse 它让对象按原路径返回 CCJumpTo和CCJumpBy示例 创
  • react中context的使用详解

    先说一说context是干什么的 跨层级通信 一般组件通信的方法都是通过props来传递 不过这种方法当有了第三级或往后孙孙组件的时候就显得比较繁琐 以及不好修改 这时我们可以使用context来管理这些数据 不管多少层级都能让想要使用这些
  • 线程函数不能为类成员函数_GPU编程2CUDA核函数和线程配置

    CUDA核函数 在GPU上执行的函数称为CUDA核函数 Kernel Function 核函数会被GPU上多个线程执行 我们可以在核函数中获取当前线程的ID CUDA核函数的定义 global void addKernel int c co
  • 堆栈桢的生成原理

    摘要 那么Windbg分析Dump时 会如何推理堆栈过程呢 如果每个函数都是有标准的push ebp 那么按照ebp递推就可以了 否这就只能用其他方法分析 比如看看堆栈里某个地址是不是函数返回地址 该地址属于某个模块的代码段 这样就可以确定
  • mac系统下面调用brew报错core_ext/kernel_require.rb:55:in `require': cannot load such file

    mac系统下面调用brew报错 如下所示 usr local Homebrew Library Homebrew vendor portable ruby 2 3 7 lib ruby 2 3 0 rubygems core ext ker
  • [598]Windows版InfluxDB及相关软件安装与配置

    公司在做一个工业监控系统 虽然数据采集点并不算多但是数据量积累下来也非常大 使用mysql数据库进行数据存储和查询时很慢 所以让我调研一下时序数据库 通过调研和了解时序数据库在海量数据的读取和写出都比关系型数据库和NoSql快很多 有人做过
  • 如何向 Pandas DataFrame 添加行

    您可以使用df loc 函数在Pandas DataFrame的末尾添加一行 add row to end of DataFrame df loc len df index value1 value2 value3 您可以使用df appe
  • 计算机网络基本概念相关习题(二)

    一 单项选择题 1 不是对网络模型进行分层的目标 A 提供标准语言 B 定义功能执行的方法 C 定义标准界面 D 增加功能之间的独立性 2 将用户数据分成一个个数据块传输的优点不包括 A 减少延迟时间 B 提高错误控制效率 C 使多个应用更
  • 毕业答辩模板

    毕业答辩准备工作 一 首先是开场白 各位老师 上午好 我叫 是 级 班的学生 我的论文题目是 论文是在 导师的悉心指点下完成的 在这里我向我的导师表示深深的谢意 向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢 并对三年来我有机会聆听教诲的
  • 三层架构、MVC、前后分离的一些知识

    三层架构 MVC 前后分离的一些知识 三层架构模型 MVC模式 三层架构与 MVC 架构区别 前后端分离开发时的变化 一个前后端分离项目的分层 前端 MVVM 后端 Service层 Model层 Mapper映射 BLL业务逻辑层 DAL