最近总结的设计模式和提高网站效率的一点想法
最近公司的项目进入了最后阶段,问题也不断的展现出来。我负责的只是项目中的一个相对独立的小部分,所以要考虑的问题也都是基于这一小部分的。
由于开发中这一部分使用了NHibernate,开发难度大大降低,同时带来效率问题大大增加。不过在目前的测试中没有发现跟直接写SQL语句有太大差别,可能是数据量还不大,而且NHibernate的缓存做的不错。但是日后数据量达到一定程序的时候,这个问题就不得不考虑了。
另外由于后面还会继续开发内容管理系统合并到这个系统上来,而且公司也一直在考虑页面静态化的问题,所以虽然还没有用到,但是先把这一块想清楚。
因为整个系统是跟用户密切相关的,而且相当一部分内容是处于经常变化的,因此原始的生成静态文件的方式并不适用,因为可能会造成大量读写磁盘。因此,我考虑将静态化的内容也存入数据库,每一个动作先检查数据库里面保存的页面是否过期,如果没有过期,直接读出来返回客户端或者交给它的上级动作。每个动作了解自己的需求,也就是所需要的参数,包括Request, Cookie, Form, Session等等,这些参数就是决定静态页面的唯一标志。
而系统的架构也因此可以定下来了。整个系统有一个顶级动作,往该动作里面添加子动作,由此递归或者循环的生成每个动作的结果,最终页面由顶级动作提交到客户。
系统还有另一个需求,就是要记录日志,用来分析用户行为或者管理员的操作记录。由这两条要求总结出一个方式,所有的动作源于一个基类Action,该类包含一些基本属性Name和Params,还有一个PreProcessActions的ArrayList,最终的输入结果的方法是GetResult,而GetResult这个方法子类并不需要去实现它,在这个方法里面首先检查这个ArrayList,如果非空就执行它里面包含的动作,并将自己作为参数传递进去。然后检查一个标志位,如果没有被改为True,就继续执行自己的过程,否则停止执行,返回一个用来保存结果的变量Result。
在这个ArrayList里面可以加入两个动作变量,一个用来将该操作及参数写入日志表,另一个用来检查该动作在数据库里面的静态文件是否过期,如果没有过期就取出来并赋给传入动作的Result变量,并将其停止运行的标志位置为True。否则,让动作继续执行,(或者直接执行该动作的生成结果页面的函数,并将生成的结果写入数据库,然后停止动作的执行)。
这样,如果以后再增加其它的需求,都可以增加对应的前置动作,并给需要该需求的动作插入它的一个实例变量,就可以方便的实现插件机制了。
当然了,如果要求对系统不重新编译就加入新的插件功能,就需要将这里的参数列表改成字符串数组,到时候传入插件的类名,然后使用CreateInstance的方式动态加载这个类,并执行里面的动作。不过这样对于程序的速度会有比较大的影响,所以最好少用。
推荐到鲜果:


评论