看了《系统架构:Web应用架构的新趋势---前端和后端分离的一点想法》 这篇文章,对前端与后端的分离很是认同,这样作对于系统的维护是有至关大的好处的。正好本身也设计了一个这样的系统,因而把它拿出来,和你们讨论一下。这个架构,与其说是想出来,还不如说是我作系统总结出来的最佳实践。html
咱们作的系统,前端的页面基本都是使用 JavaScript 的富户端页面,主要应用的框架用,jquery、jquery ui、knockout js、Durandal、另外,还有本身封装的一些 UI 组件,后端的主要采用到的技术有 OData、MVC、Linq to SQL 以及本身写的一个权限管理组件,数据库采用的是 SQL Server 2005。前端
下面向你们介绍一下各模块的功能以及其划分的目的,咱们先从用户界面看起吧jquery
简单点说,就是一个给界面调用的数据访问层,不少人都人这样的疑问,在这里加一个数据访问层,是否是多余?只要你作的前端,你都会碰到下面这些问题:程序员
一、一个产品或者项目,前端与后端是同时进行了,这时候,根本没有后端的接口,甚至能够说,连个接口的定义都没有。做为前端开发人员,你如何去开展本身的工做?数据库
二、做为前端开发人员,你有没有碰到,由于后端的接口挂掉,致使你的工做无法继续作下去的情形?后端
三、做为前端开发人员,每每免不了要和第三方的接口进行对接,你有没有碰到过,和你作对接的人员,忽然由于项目紧,被抽走了,留给你的只有一堆须要传N个参数,传了后接着出“对象为空”的异常呢?你根本不知道哪里参数传错了。面对这些接口,你除了破口大骂,得不到任何帮助。设计模式
四、做为前端开发人员,你有没有试过,你向后端的开发组,要一个接口,他们须要讨论个几天,而后再花几天才能给你,给你以后,还不能用,又得再花几天时间调试呢?缓存
若是你向我同样,都曾经都碰过这些问题,你就不会怀疑这个 dataProvider 存在的必要了,有了这个 dataProvider,能够最大减小后端接口对前端开发的影响。下面是一个 dataProvider 的实例:架构
var dataProvider = (function () { var fakeProvider = { countries: new Countries() }; var realProvider = { countries: new JData.WebDataSource() }; //下面的接口,根据状况二选一 return fakeProvider; //这个是假的 dataProvider,从本地读 return realProvider; //这个是真正 dataProvider,从接口读 })();
从上面能够看出来,这个 dataProvider 使用了工厂模式来建立,它有两个实例,fakeProvider和realProvider,fakeProvider是用来提供一些模拟数据,而realProvider提供从接口读取出来的数据。当没有接口,或者接口挂掉,咱们能够先从 fakeProvider 来读取数据。等接口好了,切换到 realProvider 。app
一、数据的验证。用户在界面输入数据后,接着调用 dataProvider 里的接口对数据进行处理,可是在向服务端提交以前,得先对数据进行验证。那个这个验证如何进行呢?dataProvider先从服务端获实体的描述信息,这些描述包括但不限于:主外键、属性的验证信息(好比是否可空),固然,这个实体信息是能够缓存起来,以便重用的。而后 dataProvider 再根据这个描述信息来对数据进行验证。
二、错误信息的显示
当验证到某一个属性不合法,验证信息的模块就在页面查找出对应输入控件,它是怎么查找的呢?好比说,Contry 的 Name 输入为空是不能够的。那它就先查找 id 为Coutry的元素,而后再Coutry元素下面再找id 或者 name 为 Name 的控件,若是找不到则直接弹窗显示错误信息。例如:
<form id="Country"> <input name="Name"/> </form>
一、做为后端开发人员,你有没有碰到过这种前端开发人员,今天让你加一个字段,好,加了,而后打包发布。明天又让你加一个字段。后天忽然又说,前两天加的字段,不须要,你会不会有种想喊“操”的冲动?
二、做为后端开发员员,你有没有碰到过这种前端开发人员,今天跟你说接口不够用,要加个 GetUserByName 的方法,明天又说,还得加个 GetUserByEmail 的方法?而后,过了一段时间,你发现接口愈来愈多,维护的模块愈来愈痈肿,而且这些接口,你只敢加,不敢删除。由于,你根本不知道这些,有哪一个不用的,你跑去问前端,他也回答不出来。因此一些接口哪怕是没用的,也只能永远系统里,直到它生命周期的结束。
若是你也碰到相似于我这种烦恼,使用 OData 也许是一个不错的选择,把查询的权限都开发给前端的开发人员,他爱怎么查就怎么查,都由它去。
咱们的系统,使用MVC都是用来处理从前端提交上来的数据的,使用它主要是开发人员都熟悉MVC,而后MVC再调用业务层代码,同时,还须要处理:
一、对提交上来的数据进行验证
二、处理系统的异常,包括对异常进行从新的包装,再传回到客户端,以便于客户端的处理。对异常的信息进行记录。
关于数据访问层,在咱们的系统里实际是一个 ORM 的包装器(ORM Wrapper),你在对 ORM 裹上一层外衣。目的在于:
一、对数据进行拦截。例如:有些数据,只对某个角色的开发。数据访问层须要对根据过滤条件,而后再结合查询条件,从新生成SQL。
二、对数据假删除的处理。见过不少系统,都是把删除放到业务层来进行的,其实这是不适合的,从业务的角度来讲,关心的是删除,在执行删除后,这条数据从我眼前消失就能够了。至真删除仍是假删除,这与我无关。数据访问层,要作的就是这工做,它能够数据在真删除与假删除之间进行切换,只要配置一下,就能够把真删除变成假删除(其实就是把Delete操做变成Update操做),使得进行业务开发人员,不用再关心数据的真假删除。
三、对数据进行跟踪、备份。你确定碰到过这么一种须要,须要记下来,每一次的更新操做的时间,以及更新了些什么内容。对于删除的数据,可以把它还原回来。数据访问层,经过对 ORM进行包装,彻底能够记录下每一次更新、删除这些操做,而后记录下来便可。固然,这些需求利用数据提供的功能也是能够实现的,不在讨论的范围内。
这篇文章到此结束,欢迎你们的板砖。
PS:过年的时候,我会把 ALinq 和 Visual Entity 更新到 2013,各位用户就别催更了,最近实在是忙,抽不出时间更新呀。
公司招聘
初级程序员:懂 JQuery、JQuery UI、JQuery Validate、Knockout JS 等JS 框架,略懂 Linq to SQL,能阅读文档,根据文档示例写代码
中级程序员:有阅读上述框架的代码,并根据项目作订制开发
高级程序员:具体很强的编码能力,能解决各类疑难杂症
牛人:能把设计模式、代码玩弄于股掌之间
地点:上海市闸北区
网站:http://www.vknew.com/index.html
在找工做的朋友能够私信我。