三层构架和 MVC 不同吗?

关注者
362
被浏览
44,408

14 个回答

做企业应用开发时,经常采用三层架构分层:表示层、业务层、持久层。表示层负责接收用户请求、转发请求、显示数据等;业务层负责组织业务逻辑;持久层负责持久化业务对象。

这三个分层,每一层都有不同的模式,就是架构模式。表示层最常用的架构模式就是MVC。

因此,MVC是三层架构中表示层最常用的架构模式。

参见《企业应用架构模式》-Martin Flower.

=========================================
这话题,其实十年前Java 社区都已经讨论烂了。。。此外,《企业应用架构模式》、《领域驱动设计》、《Pojos in action》、《J2EE 核心模式》等等经典书籍上已经讲的足够清楚了。大师们的书虽说老了点,过时了点,但是是值得精读的,咱能不能别自己随意发明名词。。。。

MVC - 模型、视图、控制器。总有人来个什么模型层、视图层、控制器层,哪里来的这么多层?是不是还要来个Service层、DAO层、DTO 层?

层,英文是tier(物理上)、layer(逻辑上)。既是层,个人理解就有上下关系,模型、视图、控制器有上下关系?否则,依赖倒转原则(高层不依赖于低层,二者都依赖于抽象)指的是啥?

三层架构,每层都有自己的模式,模式就是套路(杨氏太极拳十八式,就是套路),每一层都有自己的套路,就是所谓架构模式。

表示层最常用的套路、模式就是MVC ,MVC就是表示层的一种架构模式。
业务层的架构模式有事务脚本模式、领域模型模式、CQRS 等等(另一种说法是贫血、失血、充血、胀血...)。
持久层的架构模式有入口模式、数据映射器模式等等。

一般来说,框架 > 架构模式> 设计模式 > 设计原则。打个比方,Hibernate是一个持久层框架,是数据映射器模式的具体实现,实现时用到了工厂模式等很多设计模式,体现了什么依赖倒转原则、开闭原则、里氏替换原则等等设计原则。AngularJS是一个客户端 MVC 框架,是 MVC架构模式的一种实现,实现时用到。。。。设计模式,体现了。。。。等设计原则。Struts/ASP.NET MVC是表示层框架。。。。。诸如此类。

嗯,一定有人会说:这些都不重要,写出代码才是王道。一个人一个说法,初学者岂不是无所适从?看看大师们的书总是要安全些。

简单说,M-V-X 是展现层的模式,


它们消费了业务层的产品 Model, 并且使用 X 来控制用户输入与业务层产品的数据,做出各种新作为参数提交给业务层 对业务进行影响


X里面的逻辑 都是界面交互逻辑

X里面的的调用 都是用户操作调用

X里面的模型,都是视图模型(VM)


X可以是 C 可以是VM 可以是P



Asp.Net MVC工程里面用web api 是借用框架包裹了 Business层的外观,简单数据view输出。

如果在里面直接调用了DAL完成业务 是因为没做Business 层。

是设计不完全的体现


Ps: ORM的入口对象 如 EF的DBContext 本身是一种Business/Model 层的模式实现

DBContext 对应 Unit Of Work模式

DBSet对应 Repository 模式


说他们是 DAL 本身是不当的。 但是作为Model的进出路径,本身是Business 底层的持久化部分,属于下限,在MVC 的Controller 里面调用,在简单逻辑中,不算是跨层调用。

但是如果你在 Controller 里写了业务逻辑 业务逻辑中调用 UoW和Repository 就是Business 层实现的疏漏了,属于暴露业务逻辑让展现层代劳。



参考资料 MS-P&P

Web Presentation Patterns <-Web展现模式