有几年没有关注技术了,最近有点时间想把技术重新捡起来,借着重构手上的一个后台管理框架的机会将微软新的几种技术全部应用一下,从目的上来讲并没有希望能对涉及的技术有很深入的了解,所以这个系列的文章(篇幅不会太长)更多的是思考这些新技术在什么场景中使用的问题。
涉及的工具及技术:Visual Studio 2013 、 asp.net mvc 5 、 entity framework 6.0.1、 JQuery 2.0.3、 LigerUI 1.2.2
想重构手上的后台管理框架,是因为随着业务经验的积累,很多业务逻辑有了改进,随之对应的后台数据库结构有了很多改善,但那套框架是.net 2.0时代创建的,且不是由我一人创建的,前后经过好几个团队、好几个项目的修改,要想在数据库结构上应用这些改善要解决的问题太多了,而且技术本身更新、淘汰就比较快不是,既然有点时间,何不用新技术来重建,一是可以跟上时代步伐,二也可以使得积累的业务逻辑经验沉淀下来。
正因为本次重构的出发点是想进行数据结构的改善,手上现有这套框架经历的几个团队水平都不算低,在软件重用上花费的精力也不算少,但出于很多客观因素的关系,"最大程度的代码重用、以最小的代码变化来适应各种需求变更"这样的目的似乎难以达到(在一个甚至几个团队环境中,考虑团队成员更换频繁的情况下来达到这个目的,而不是以单个人在相当长的一段时间内达到这个目的),本次重构的目的之一是改善前端展示层如何快速适应数据层发生的变化,所以首先考虑MVC设计模式。早在十年前就已经接触过MVC概念了,但不是在微软体系内,作为微软技术路线的旅行者,一直没有将此概念应用到实际项目中,而今终于有机会了。
MVC作为一种设计模式,比其他设计模式更"难以捉摸",比如你去比较Java平台的众多MVC框架的实现做法与.net平台MVC框架的实现做法,不同框架对MVC的诠释不一样,作为一个初学者你搞不清楚到底哪种做法是正确的(或者说更正宗的),即便是在.net平台上,在微软官方能找到的资料中也是存在类似这样的"难以捉摸"的地方,举个例子:
上图应当是微软中国(也可能是其某个合作伙伴)对MVC设计模式的一些诠释,图中讲到"Model被Controller更新后,会直接通知View并更新显示",asp.net mvc 5的实际情况却是Model和View是没有通信的,都是Controller通过调用IView接口来通知View更新,且Controller并没有将Model直接传递给View,而是复制一份后将复制品传递给View。从这个角度来讲:asp.net mvc 5其实是MVP设计模式而不是MVC设计模式。你也许听说过另外一个概念"MVC2",根据相关概念解释:MVC2与MVC的区别就是Model和View是否通信,由此又可以判断所谓"MVC2"模式其实就是"MVP"模式。然后还有MOVE模式,该模式添加了一个Event来单独处理Model、Controller、View之间的通信。当然针对MVP和MVC也有另外一个应用说法:上图中的MVC模式适合于CS结构软件,而MVP模式适合于BS结构软件,这样倒也能解释通asp.net mvc 5中Model和View是没有通信的。
我还看到过一个分析cocoa框架中对MVC的诠释,核心概念如下图所示:Model和View是完全隔离。
另外,关于View的更新是通过Model发出还是通过Controller发出除了CS/BS结构的考虑外,减少代码冗余也是考虑因素之一(老实说这个因素我没理解到其含义,不过这篇文字最后一句话:所以,我觉得,不去彻底的MVC,不去彻底的脱耦,改为由controller先改变model,再由controller直接去改变view,要省不少代码和时间,当然换来的弊处就是controller必须要依附于view的存在了。。。 看看asp.net mvc的Controller如何定位到View的默认规则,可不就是依附于View了嘛)。
到底什么是MVC设计模式以及该如何应用此设计模式呢?我在WIKI百科上找到了MVC的定义,自我小结:在设计软件架构时,只要存在将软件系统分成模型(Model)、视图(View)和控制器(Controller)三个部分,即为应用了MVC设计模式(这通过选择一个MVC实现框架即可轻松达到),但这还不够,在设计、开发软件的整个过程中时刻注意MVC的两个应用目标:MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。(这第二个步骤可以说是我整理这份学习笔记的重点所在,就是我后面提及的"代码结构组织")
.net 平台上的MVC实现框架已经有很多可选择的了,对框架选择的因素有很多,比如对MVC实现的彻底程度、处理性能等等,我没有也不打算对目前主流的MVC框架进行这样的挑选,经验告诉我当你选择一个框架应用到实际项目时,你总是有机面对这个框架的一些不足或者说缺陷之处的,花点时间,不足和缺陷都能解决,所以我采用了官方的MVC框架。
作为asp.net mvc 5的初学者,官方教程是精练的。 网上大部分教程都是引用的这套教程,so 不用浪费时间去搜索。
在2011年下半年的时间,我投入了3个月的时间策划开一个小吃店,虽然最后由于发生一些变故没有做成,但总算对开一家餐饮店的整个策划过程有了比较深入的了解,回头想想一家餐厅的运作采用MVC模式是比较好管理的(是否利于产生盈利这个不说),一家餐厅要想有持续的客源,厨师是最重要的,做的菜品能符合客户的胃口才能让客户持续来店,这个厨师就是MVC的Model,顾客来店通过菜单点菜,这个菜单就是MVC的View,顾客点菜后由服务员下单,这个服务员就是MVC的Controller,服务员下单通知厨师做菜,厨师只负责做好菜,菜是给哪个顾客做的不管,由服务员(也就是Controller)来负责上菜。 这就是MVC模式的核心:Model负责数据的处理,Controller负责调度和控制,View负责展示数据给用户。