首页 > 代码库 > .net开发,html ajax开发架构之我见 bs ajax最简化法 Knock out Request,totally oo
.net开发,html ajax开发架构之我见 bs ajax最简化法 Knock out Request,totally oo
.net开发中,无论ajax还是webform,webpage, 总免不了要和request这个静态全局,可以远程通信的对象打交道。
而对于软件来讲,按照Matin Fowler的的面向对象,可利用软件的设计之道之说,面向对象的软件,OO最大的好处莫过于实现了良好的封装和复用。
通过封装和复用,我们就可以实现自己理想中的软件,我总结并经常说的其中一句话“整套软件一定要所有的代码只写一遍,而且,从不写第二遍”,这句话表明了我自己在oo上的追求,而我也不断将自己的写法向更优雅更易复用的方向迈进。
而对于Oo,我还总结了第二个方法,是关于软件的输入点的,也就是,“整套软件应该只有一个输入点,即配置的最小化”。而我们在写软件的时候,看过OOD方面书籍大部分的人都知道单一职责,基于抽象与接口,而这些方法,也只是我们考虑问题的基本,“不可能一次做好所有的事情,但你从来都有时间重做”,从这点来看,重构提练方法就体现了个人的思维的周全。
其实软件开发,我从来都觉得在这一方面耍些小聪明是必要的!一定要想方设法来偷懒-这点从我上面提到的第一点上就可以看出,重复返工谁也不会喜欢,而只写一次,与其说懒,不如说此时已经达到了复用的阶段。
但写了不少代码,发现真正的重构,很少是事后已经完全写好之后才做出的,往往是边写边观察,在写一个类的时候不断重构提取其中的方法。然后每个方法最终小的只剩下基本上三行就搞定了,而越小越明了的方法往往更加利于个人往此类之外提取和重构。
最后说下我在AJAX方面发现的一个比较简便的方法,这个是重点,我个人认为,这已经将HTML AJAX开发的精简达到了极致-看现在的各种JS构架,无论是MVC的 angular js或是其他的一些对dom做一些个性定制的js 框架,我个人认为它们也许在使用上更加地优雅和利于使用,但是它们总是出现了更多的js的封装,并不是说Js的封装不好,我个人也喜欢一些封装的js的组件,比较常用的table,pager等等,但是在开发和传输数据上,我倒并不赞同他们的方法,我还是觉得最简化的方法永远都是使用html原有特性的方式。
我目前使用的开发方法是 使用html的form进行封装一个表单,而表单中的各项,按ruby on rails的设计思想和大家熟知的理念“约定大于配置”这个黄金定律,而往往一些比较好的已经被大部分人接受的约定往往能发按意想不到的作用。
所以在ajax方面,按照解耦的思想,前端和后端是完全分离的,也就是一个前端,只需要后端提供数据,而数据来源大可以换一种架构或编程语言来实现,这些都无所谓。 而 大家都知道现在的编程语言都有元数据这种包含数据类型与操作描述的东西,那么用反射,我们就可以使约定成为实实在在的类型。
ajax方面,我们就只需要将自己想要的东西写在form中,添加name,然后序列化后 传输到后端,而后端,我们就以此name 约定为自己的实体model的property来反射实现实体的自动赋值,这样也就达到了knock out request的目的,据我所知,现在流行的oo web语言等包括 Php jsp c#都有各自的反射机制,所以机理也是一样的,这样就实现了只有一个输入点。也就是配置了Name,全局再不要配置,接下来就是完全的oo了,可以restful,可以各种方式操作对象了。
Ps:web ajax开发中,若要使用http handler也可以,只是 方法过多,往往会出现很多个handler,而反射 method invoke方法 和入口后 使用工厂来创建的方法又往往要求过多,你不得不按约束来弄一堆,而且这种方式总感觉不是那么优美,最后选择了webservice,虽然.net2.0下没安ajax扩展会出现找不到scriptservice,但也只需要将最后返回的xml中取string tag中的内容即可,而json从来都是一个js对象,目前已经成为web中传输的一种标准。
总结吧:从request中直接反射来取model,因为数据无非就在于request 的form和query string两个集合中,通过一次约定name,这样就实现了只有一次输入,完全的Oo入口,最小化了配置入口的思想。
补充:我个人认为,反射取值的时候,倾向直接按索引key来取,而把request null的异常扔掉,这样可以提高一些性能上的优点,因为 按表索引 和全文搜索的区别用在这里,取特定值的时候尤其是在已经加了索引的键值上,自然是直接取键值快过循环对比再取。此处的类型转换,是将类型转换为Model的property type,catch时 将这个异常忽略我想会比较好一些。