写在前面:最近写程序的时候,经常用到三层架构,并且项目需求分析之后需要使用到asp.net MVC,在两者的结合使用时,经常把两者混为一谈,结果在项目编程中发现,如果将两者混为一谈,那么三层架构中的数据访问层(DAL)与业务逻辑层(BLL)那么应该放MVC中的什么地方呢?如果将这两层都合并到MVC中间,那么底层的后台代码岂不是都放入表现层(UI)中了?这与三层架构的核心优点,将代码分层,降低代码耦合度又相冲突。后来经过查阅得出以下总结:

  • 三层架构与MVC不是同一概念,绝不能混为一谈。
    三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目。
    MVC是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。
    架构设计是用于指导软件,系统各个方面的设计。架构设计的目的请自行百度,这里就不过多赘述。
    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,使用设计模式的目的是为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;
    所以三层架构与MVC是不属于同一层次的事物。
  • MVC与三层架构的目的不一样:
    MVC的目的则是实现Web系统的职能分工,即职责划分。
    三层架构的目的着重点是:高内聚,低耦合”,即解耦。
    其实职责划分也是解耦,但是三层架构侧重的是整体的一个解耦,而MVC侧重的是web系统的解耦。
  • MVC与三层架构的联系
    MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。
    我们通常所见到的MVC一般也都是在应用三层架构的基础上,即将Model层再进行分层,也就是ViewModel,用来提供给View进行展示的Model,与我们真正在后台进行增删改查的model不同。而如果Model不再进行划分的话,那么使用MVC的意义也就不大了。
  • 为什么要使用MVC
  • 大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化(自PHP5.0版本后已全面支持面向对象模型)语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。
    首先,最重要的一点是多个视图能共享一个模型,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。
    由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Adobe Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
    因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松耦合的构件。
    对我来说,控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
    拿一个简单的登陆模块说,需求是你输入一个用户名、密码,如果输入的跟预先定义好的一样,那么就进入到正确页面,如果不一样,就提示个错误信息“你Y别在这儿蒙我,输入的不对!”。
    V 这个小小的模块中,起始的输入用户名密码的页面跟经过校验后显示的页面就相当于View
    C 而这里还需要一个Controller页面,就是用于接收输入进来的用户名密码,还有经过校验后返回的一个flg(此flg就是用于判断你输入的是否正确,而跳转到相应的页面的)
    M 最后还缺一个Model,那么就是你那个用于校验的类了,他就是处理你输入的是否跟预先订好的一样不 这样就完全实现了逻辑跟页面的分离,我页面不管你咋整,反正我就一个显示,而Controller呢也不管你Model咋判断对不对,反正我给你了用户名跟密码,你就得给我整回来一个flg来,而Medol呢,则是反正你敢给我个用户名跟密码,我就给你整过去个flg
    M 提供数据、数据之间的关系、转化等,并可以通知视图和控制器自己哪些地方发生了变化。
    V 提供显示,能根据M的改变来更新自己。
    提供显示,能根据M的改变来更新自己。
    C 比如视图做了点击一个按钮,会先发给这个视图的控制器,然后这个控制器
    MVC是一个复合模式
    MV,MC都是观察者模式
    M内部的组件组合模式
    VC之间是策略模式(可以随时更换不同的控制器)来合模式
    VC之间是策略模式(可以随时更换不同的控制器)