首先,它俩根本不是一个概念。
三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目。
MVC是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。
那么架构跟设计模式有什么区别呢?
我们从接手一个项目开始,首先,我们需要进行架构设计,一般我们采用的就是分层式的架构设计,即我们的三层架构。
然后,在确定了架构以后,我们再根据项目的具体需求去考虑是否需要应用一些设计模式,比如是否应用我们的MVC模式,抽象工厂模式等等。(在这里我们看出,MVC与三层架构不是一个等级的,而与抽象工厂等设计模式才是一路的)
最后,确定了模式以后,就是我们的一些具体的实现了。(当然一个项目不仅仅考虑这些问题,我只是为了说明两者的区别,将其他问题已省略)
其次,它俩划分的层次不同。
三层架构将整个项目划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
MVC 即Model(模型),View(视图),Controller(控制)。
下面看一下他俩的区别与联系:
通过这个图我们可以知道,我们平常所说的V是UI,C是BLL,M是DAL的观点是错误的。
而我们通常所见到的MVC一般也都是在应用三层架构的基础上,即将Model层再进行分层。而如果Model不再进行划分的话,那么使用MVC的意义也就不大了。
然后,它俩的目的着重点不同。
三层架构的目的着重点是“高内聚,低耦合”,即解耦。
MVC的目的则是实现Web系统的职能分工,即职责划分。
其实职责划分也是解耦,但是三层侧重的是整体的一个解耦,而MVC侧重的是web系统的解耦,即侧重jsp和Servlet的一个解耦。
最后,为何我们会将其混为一谈?
既然两者有这么多的不同,我们为什么还总是将其混淆呢,下面我列举了几个我们常常将其混为一谈的几个原因:
1.二者都是“三层”。
这个原因是最容易迷惑我们初学者的,一个是UI,BLL,DAL,一个是View,Controller,Model,不都是三层吗?
虽然都是“三层”(不一定是真的三层,还可以是多层),但是它们的划分的不一样。大家可从上面的图中看出不同。
2.MVC总是伴随着三层架构。
这个就是我在前面一再强调的,我们一般是在考虑使用(也可以不使用)了三层架构的基础上再根据具体需求决定是否需要使用MVC,于是我们常说的MVC中总是伴随着三层架构,所以大家总是会认为MVC就是三层架构,三层架构就是MVC,殊不知,它们二者是一起出现的。
3.都是在分层,即都是在解耦。
前面说它们目的的时候也说了,虽然它们的侧重点不同,但是它们的总体目的是一样的,都是为了解耦,对于初学者而言,是不知道这两个侧重点有何不同的。
大家往往对它们的联系知道很多,不然也不会混为一谈,但是对它们的区别却知道较少,希望我上面讲解的它们两者之间的区别可以让大家对它们有些了解,如有写的不妥的地方,请指教。
MVC 的优点:
1. 通过把项目分成model view和controller,使得复杂项目更加容易维护。
2. 没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为
3. 应用程序通过controller来控制程序请求,可以提供丰富的url重写。
4. 对单元测试的支持更加出色
5. 在团队开发模式下表现更出众
Web窗体的优点
1. 采用事件驱动模式来控制应用程序请求,由大量服务器控件支持
2. 采用页面控制机制,可以为单个页面添加事件处理函数。
3. 使用view state和服务器端页面,使管理页面状态信息更加轻松。
4. 对人数较少的想使用服务器端控件的开发团队,使用起来更加方便。
5. 开发起来比mvc模式要轻松简单一些。
MVC 框架特色
1. 分离任务(输入逻辑,业务逻辑和显示逻辑),易测性和默认的测试驱动组件。所有mvc用到的组件都是基于接口并且可以被mock对象测试到,你可以不必在asp.net进程中运行controller就可以使用测试。使得测试更加快速和简捷。
2. 可扩展的简便的框架。mvc框架被设计用来更轻松的移植和定制功能。你可以加入自己的视图引擎,url重写策略。重载action方法等。mvc也支持Dependency Injection(DI) and Inversion of Control(IOC)
3. 强大的url重写机制让你更方便的建立容易理解和可搜索的url。url可以不包含任何文件扩展名,并且可以重写url使其对搜索引擎更加友好。
4. 可以使用asp.net现有的页面标记、用户控件、模板页。你可以使用嵌套模板页,嵌入表达式<%=%>,声明服务器控件、模板,数据绑定、定位等等。
5. 对现有的asp.net程序的支持,mvc让你可以使用如窗体认证和windows认证、url认证、组管理和规则、输出、数据缓存、session、profile 、health monitoring、配置管理系统、provider architecture特性。