刚毕业的时候,参与了一个上位机的系统开发。上位机所使用的是.net Windows Form技术。

当时,和一个北理的姑娘在一个项目组里。因为她来公司时间比较长,而且经验比较丰富,所以,上位机的架构由她来做。

在项目开始,她设计了整个项目的脚手架。这个脚手架大概是这样设计的:

1. 采用“三层架构”搭建整个系统

2. 该“三层架构”分为:UI层,业务逻辑层,实体层

  • UI层包含了所有的Windows窗口、控件
  • 业务逻辑层包含了所有的业务逻辑、数据库访问等
  • 实体层包含了所有的业务实体,其实类似与Java Bean

3. 每一个业务模块都对应的有一个.net动态链接库项目,每一个业务模块按照上述第二点的“三层架构”进行分层

这个项目终究是“上线”了。后来想来,这个项目架构存在一些问题点。

1. 因为模块的业务量很小,但是模块很多,每一个模块对应一个DLL项目,而模块之前存在不同程度的依赖,例如:实体与实体之间的依赖,所以整个模块的依赖关系非常混乱。

2. 对“三层架构”的理解不到位。按理应当先分成主要的三层,UI层、业务逻辑层、数据访问层,数据访问层是比较稳定的,产生了非常多的、混乱的代码

3. UI层没有组件化,很多Form都是通过拖拉拽.net的控件拼凑而来,造成了很多的UI控件重复,无法复用。。

4. UI层的代码与业务逻辑代码紧紧联系在一起,一个复杂的Form文件甚至超过了2000行的代码

以这个我亲身经历的案例作为引子,来谈一谈我对三层架构、以及MVC的理解。

三层架构

现在可能听到“三层架构”的机会少了。在我毕业那会,三层架构是非常流行的。三层架构主要分为:界面层、业务逻辑层、数据访问层。这种分层架构是一种基本的模型,我们很多时候会分出来更多的层。例如:实体层、服务层。这里,我们来分别谈谈每一层的职责。

界面层:界面层就是我们经常说的UI,可以是Form、可以是Control、可以是HTML/CSS/JS。这一层主要是用来提供给客户的界面接口的。

业务逻辑层:业务逻辑层包含了所有对系统业务功能的操作。例如:生成一个订单、提交订单到生产部门等等。

数据访问层:对数据库的访问。

相信大家都很了解这几个层的职责,但它们之间是怎么交互的呢?

1. UI层与业务逻辑层的交互往往都是以事件驱动来调用业务逻辑层,因为业务逻辑层返回给UI层的往往是一些业务实体,所以,UI层同时依赖与业务实体

2. 业务逻辑层依赖于数据访问层。业务逻辑层会组装各类数据访问操作,从而给UI层提供服务

3. 数据访问层直接操作数据库,执行各种SQL操作。

这三层都会依赖于业务实体,所以,往往我们都会在项目里添加实体这一层。

接下来,我们再看看MVC

MVC

MVC大家都很熟悉。分别是Model层、View层、Controller层。

1. Model层一般会分为Service层、DAO层、Entity层

2. View层主要为视图,就是用来提供给用户操作界面的接口

3. Controller层是与三层架构的一个重要区别,它像夹心饼干中间的那一层。Controller层把Model和View层连接到一起。

它们之间的交互关系如下:

1. View调用Controller中的接口,进行数据操作,Controller执行完后更新View。

2. Controller依赖与于Model层,接受到用户的操作后,Controller根据客户的不同请求执行不同的服务。

3. Model层,Model层包含了主要业务逻辑、数据存取等操作。之前的Structs,View层会依赖Model中的实体,直接将实体按照固定的模式展现到视图。

最后,我们回过头来看看三层架构与MVC。

在网上看别人的帖子,很多人说三层架构与MVC没有任何关系。我觉得这个说法有点不太妥当。其实,它们的本质都是分层。只是对层次的划分有一些区别。

1. 因为三层架构中没有Controller层,所以UI层是比较胖的。往往在UI层中包含了大量的业务逻辑代码

2. 三层架构中业务逻辑层和事情数据访问层其实就是MVC中的Model层。对应Service和DAO

可以说,MVC是三层架构的升级版,现在的很多架构其实就是分出来更多的层,分层的目的也比较明确,就是要解耦和。每一层单一职责,某一层做一件事情。其实,这些思想都是相同的,如果我们再细分到面向对象设计。我们也提倡SRP,其实与我们的架构要解决的问题是类似的。

另外,有不少人认为三层架构是一种架构、而MVC是一种设计模式。我觉得这是在咬文嚼字了。那我叫做“三层模型”好吗?他们就是一类东西,都是在分层,都在解耦。

这样一想,我觉得清晰多了。

关于三层架构与MVC的一些理解的更多相关文章

  1. 三层架构 与 MVC那点事儿

    以下为转载内容: 地址 MVC与三层架构的异同点 首先先解释一下MVC. V即View.是视图的意思. C即Controler.是控制器的意思. M即Model,是模型的意思. 这三个里.最不容易理解 ...

  2. 三层架构与MVC的区别

    我们平时总是将混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. MVC是一个设 ...

  3. 三层架构和MVC

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...

  4. Web项目的三层架构和MVC架构异同

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

  5. [1] [转]软件架构之三层架构和MVC的关系

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...

  6. Django——WEB三层架构与MVC

    而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时 ...

  7. JavaEE三层架构与MVC

    JavaEE三层架构与MVC 摘要与总结 等下总结下 MVC模式 Model1 ​ 说到设计模式,不得不提一下之前的的Model1.据说早期对于java企业项目的开发,用的是Jsp+JavaBean的 ...

  8. 三层架构与MVC之间的区别

    文章转发自:http://www.admin10000.com/document/535.html 我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真 ...

  9. 三层架构与MVC & 设计模式的较量

    刚刚学习了三层架构,并且正在实际应用中,但随着学习的深入,又了解到了一个叫MVC的东西,(早在设计模式中就听到过MVC,仅仅是简单查了一下什么意思.)如今正好把这三个东西放在一起聊聊. 三层 是一个分 ...

随机推荐

  1. [LeetCode] First Bad Version 第一个坏版本

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  2. [LeetCode] Contains Duplicate 包含重复值

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  3. Zend Framework 项目 index.php 的问题

    默认生成的Zend项目在public目录下会自动生成一个.htaccess文件,这是用来实现伪静态,即隐藏index.php这个唯一入口文件的. 但是,搭建项目时遇到一个问题:URL中如果不加inde ...

  4. C语言中struct位域的定义和使用

    位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...

  5. 【日常操作记录】Asp.Net Core 的一些基本操作或属性

    用于记录在项目中使用到的方法.属性.操作,持续更新中 静态文件的使用 在项目中静态文件的使用需要在Startup中的Configure方法中增加: //使用静态文件 app.UseStaticFile ...

  6. jQuery ui autocomplete 与easyUI冲突解决办法(重命名ui的autocomplete 和menu部分)

    http://jqueryui.com/download/   UI定制只选autocomplete 会自动把依赖的menu模块也加入进来--然而easyUI也有自己的menu,于是就-- 折腾了好久 ...

  7. 常用的一些linux命令

    最近接触到一些linux环境部署的事情,下面分享一些最近使用的比较频繁的一些linux命令~ 1.一次性移动多个文件到一个文件夹里 mv  被移动文件名 -t 目标文件夹 如:mv a.txt b.t ...

  8. pyMysql

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  9. Android Automotive开发之一《编译自己的SDK 》 // TOBEDONE

    自己动手编译最新Android源码及SDK : http://blog.csdn.net/dd864140130/article/details/51718187官方文档,怎样编译sdk : http ...

  10. vim as python IDE

    参照Martin Brochhaus大神的视频,今天我也尝试了一下配置vim python IDE以后使用过程中只需要https://github.com/wyj1239630590/vim-as-a ...