在我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经典的是三层架构,那么,什么是三层架构呢?它包括表现层、业务层、数据访问层;而对于一个新手来说,从抽象意义上的三层架构,逻辑上就划分为三个层。这个是最基本的三层架构模式。表现层充当系统的界面呈现以及UI逻辑的角色,也就是说,UI(用户界面)属于表现层;举一个对于asp.net WebForm来说,人们喜欢把对于UI的控制逻辑(服务器控件的读取、设置、事件等等)写在页面的后置隐藏代码中,并且依赖业务逻辑层。当然,服务器控件支持数据绑定的功能,可以通过数据源进行绑定控件。这样就可以节省在后置隐藏中的代码。因此,我们就可以把表现层分为UI用户界面以及UI逻辑:UI用户界面的职责只是作为数据输入和输出后的展示工作。UI逻辑的职责是负责业务逻辑层以及UI用户界面之间的数据交互,并且尽可能地让UI逻辑不依赖于UI技术。其中UI用户界面的实现方式有很多,包括ASP.NET、WinForm、WPF、Silverlight、移动Web、智能设备等等。将表现层中UI页面和UI逻辑分离的策略中,当前使用最多的两种模式是MVC模式和MVP模式。MVC模式,即模型-视图-控制器模式,通过视图触发并执行某个操作,调用控制器,通过控制器去操作业务层,最终返回模型,在视图中进行展示。这里的模型可以是一个领域模型(DM),也可以是一个数据迁移对象(DTO)。MVP模式,即模型-视图-展示器模式,和MVC模式有点像,不同的是MVP中视图和模型是被完全分离出来的,视图中定义一个接口,而展示器通过调用该接口的方法以控制视图。因此,视图和模型是松散的,展示器也充当了一个控制器的角色,同时它也不依赖于UI技术。另外再介绍一种模式PM(Preentation Model),它可以说是MVP的变体,在PM中,视图不定义接口,这里的模型只是表示视图状态的类,视图中的元素被直接绑定到模型属性上。例如在WPF中,WPF就先天的具有数据双向绑定机制以及事件通知属性机制。所以它特别适用于WPF,Sliverlight等等。在开始业务层之前,不得不说一个前提,在一个小型项目中,直接让表现层调用业务层,足以解决所有问题。但是,当项目大到使用多种表现形式,如使用了各种UI技术、ASP.NET、WPF、移动设备等等,就要考虑在你的表现层和业务层之间增加一个层,以至于让表现层和业务层解耦,因为业务层作为一个业务中间件的平台,最好不要暴露于表现层中,这个层就是传说中的服务层。架构图又演化为:服务层实际上并不执行任何具体的工作,其功能在于组织各个业务对象,服务层将业务层所有的细节对表现层都隐藏起来,服务器将组织业务逻辑层中的组件,并且通过数据迁移对象(DTO)与表现层交互,因此就产生一个DTO模型。为了实现服务的可重用性,需要使用服务接口,表现层通过规定的接口访问功能。服务的实现继承服务接口,而服务的实现专注于业务层的调用。对于服务层,常用的方法包括Web服务、.NET Remoting、Rest以及WCF技术。本人比较建议使用WCF作为服务,因为可以方便地通过配置达到远程调用服务的目的。服务层消除了两个表现层和业务层之间的耦合,服务层可以实现一个远程接口,达到多UI技术甚至多平台上的通信。当然增加服务层也有缺点,假如使用WCF服务,会增加系统的调用开销,进而影响性能。业务层中包含系统所需要业务过程上的实现,并与下层的数据访问层交互。我们通常也叫做业务层叫做业务逻辑层,但我认为业务逻辑层是属于业务层的一方面,业务逻辑更专注于业务上逻辑算法的实现。因为业务层还可以包括其他的方面。业务层必须包括对业务实体尽心建模的对象模型,表达了客户的所有策略和需求的业务规则,因此就产生了领域模型。(PS:如果这里你不使用领域模型,那么需要采用业务规则层进行业务功能上的业务规则的验证和控制)领域模型包括对实体的属性定义,方法定义以及实体与实体之间的关系。从这个角度上看,UML建模至关重要,通过对UML动态图和静态图的描述,可以映射到领域模型中。从服务层刚才讲到了DTO模型,这里需要一个机制将DTO转化为领域模型,所以产生了DTO映射层(DTOMapper)。另外业务层还包括核心中间件技术,包括第三方组件,以及工作流引擎等等。业务层需要考虑到一些与数据访问层交互的设计模式,模式中包括事物脚本模式、表模块模式、活动记录模式、领域模型模式。事物脚本模式是通过方法来执行业务流程,它是一个过程式模型,事物脚本的每个方法都有一个特定的事物脚本,它侧重于业务上一系列流程上的顺序操作,它实现起来很简单,但是它有个致命的缺点就是它会造成很多重复的代码。表模块模式比起事物脚本模式,具有一定的结构,它的思想也很简单,每个数据表都定义一个业务组件(实体类,实体操作类),在.NET中更多的使用DataSet作为表模型的数据交互。但是它也有一个缺点就是它是从数据库驱动它不适合于大量的数据表以及数据表之间的复杂关系。活动记录模式中的对象中,可以包含数据和方法。它接近于数据表的结构,它的对象中执行方法中可以包含CRUD操作,验证算法,以及其他的计算功能。一般来说,领域模型不是太复杂,活动记录模式是个好选择。当然他也存在问题,同样地,它对于复杂的业务上,维护的成本也很高,并且如果需求变更导致数据库修改,就需要调整记录对象模型中的相关代码。经典应用:LINQ-TO-SQL以及Castle ActiveRecord。领域模型模式是从领域驱动设计中衍生来的,它是以业务为核心的设计模式。它对于复杂的业务逻辑,相当适用。前三种方式使用的是以数据驱动方式,数据驱动方式特点简单,但是当系统到了一定的规模后,就会到难以维护的程度。数据访问层的目的很明确,主要作为提供数据持久化的功能,包括数据的读取和写入,另外还必须包括事务处理,并发控制等等。操作数据库的方法可以有两种方式:ORM方式、ADO.NET方式。ORM可以采用一些第三方的ORM框架来实现,ADO.NET采用ASP.NET自带的数据库操作来实现。不同的数据库具有不同的持久化实现,因此这里添加一个存储仓库接口层,来适应不同的数据库实现,这里你可以使用IOC依赖注入方式进行数据库选型,可以利用Unity、Spring.NET、Castle的IOC容器等等。最后各个层中都可以依赖于公共基础设施层。公共基础设施层可以包括Common通用模块、Logging日志模块、Exception异常模块、Configuration配置模块、DI依赖注入模块、单元测试模块以及第三方组件(例如NHibernate、Sprint.NET、Castle、Quartz计划任务等等)最终图:总结:项目类型、项目规模以及业务上的需求,都影响着系统架构的设计,系统架构并不是一层不变的,没有最好的架构,只有更好的架构,并且从项目中多思考系统的扩展性。

转载源 | 博客园

-   关注“架构之美”   -

三层架构和mvc的区别_谈谈对于企业级系统架构的理解相关推荐

  1. 谈谈对于企业级系统架构的理解(zz)

    在我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经典的是三层架构,那么,什么是三层架构呢?它包括表现层,业务层,数据访问层:而对于一个新手来说,从抽象意义上的三层架构,逻辑上就划分为三个 ...

  2. 谈谈对于企业级系统架构的理解—李平

    原文作者:李平 原文地址:http://www.cnblogs.com/liping13599168/archive/2011/05/11/2043127.html 在我们刚开始学习架构的时候,首先会 ...

  3. JavaWeb三层架构的理解/三层架构的优缺点/三层架构与MVC的区别

    1.三层架构 我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器.在JavaEE开发中,几乎全都是基于B/S架构的开发.那么在B/S架构 ...

  4. 企业级系统架构设计技术与互联网应用技术结合主题一 大规模并发性能问题探讨...

    何谓大规模并发,不同层面有不同的理解 企业应用(Intranet):千级强并发,万级弱并发(在线用户),十万级用户 大型企业ERP.供应链,大型企业HR.办公OA 互联网应用(Internet):百万 ...

  5. 三层架构与MVC的区别

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

  6. redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...

    欢迎关注头条号:石杉的架构笔记 周一至周五早八点半!精品技术文章准时送上!!! 目录 一.前情提示 二.什么是数据一致性? 三.一个数据计算链路的梳理 四.数据计算链路的bug 五.电商库存数据的不一 ...

  7. linux 删除分区_详解linux系统架构--文件系统体系

    概述 之前已经对Linux系统架构的内核部分单独做了深入介绍,今天就拿Linux系统架构中的文件系统做一下介绍吧~先介绍下概念: 文件系统是文件存放在磁盘等存储设备上的组织方法.Linux系统能支持多 ...

  8. mysql 亿级高并发_亿级流量系统架构之如何设计每秒十万查询的高并发架构.md

    亿级流量系统架构之如何设计每秒十万查询的高并发架构 一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入 ...

  9. 系统架构设计师含金量_软考高级系统架构设计师如何备考?

    系统架构设计师作为软考高级资格考试,每年报考人数不少,但通过率极低,可以说是软考中最难通过的考试之一,还有一个通过率极低的是系统分析师. 所以今天给大家分享一个架构备考经验,希望能对各位正在备考的朋友 ...

  10. mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

    推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...

最新文章

  1. 从前端框架到前端架构参考资料
  2. 大数据在犯罪预防中有独特价值
  3. 大盘点 | 2020年5篇图像分割算法最佳综述
  4. paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控...
  5. C++知识点9——函数重载,默认实参,内联函数
  6. torch转mnn笔记
  7. MySQL存储结构的使用
  8. 1970 matla 时间_关于matlab:UTC到字符串的转换时间
  9. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)
  10. asp.net ajax检查用户名是否存在代码
  11. linux 拨号网关,用LINUX做在一张软盘上的拨号网关 (转)
  12. 多线程 空值线程数_跳槽涨薪季面试题之多线程(三)
  13. python函数手册(1)
  14. linux 代码量统计命令,Linux下源代码行数统计工具(sloccount, cloc等)
  15. GNS3各种IOS下载
  16. (转)TeamViewer三种许可证的区别是什么?
  17. 禅道项目管理,带你避开项目管理中的那些坑
  18. iOS自动化测试环境搭建总结
  19. 测试用例的设计方法(全)
  20. rec卡刷root吗,卡刷需要root权限吗

热门文章

  1. python热力相关系数图_【Python可视化6】Seaborn之heatmap热力图
  2. html头部打开页面为兼容模式,Web页面因为兼容模式产生的奇怪问题解答
  3. 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
  4. CDATA不支持html,我应该在HTML5中使用(Should I use in HTML5?)
  5. 获取url中带的参数
  6. 第六章 第一个Linux驱动程序:统计单词个数
  7. 钝化 会钝化 订单审批流程 码一会er
  8. 预处理命令(宏定义,条件编译,头文件)
  9. NSTimer(2)
  10. 阿里云 POSTFIX 邮件服务 PHP