目前在程序中使用了NHibernate作为ORM方案,为了网站前台的灵活性,想采用这样一种模板处理技术:
页面模板使用HTML模板,美工可以在页面里加入一些固定的参数,比如{ShowNewArticleList,1},这样这里就会显示分类ID为1的最新文章列表,这样就要求先解析模板,找到所有类似格式的字符串,拿到里面的函数名,然后用反射调用这个函数.
都知道反射可能会带来比较大的性能损失,那么我想如果能够将反射这一步跳过,性能上应该不会太大问题吧.比如根据Command模式,将这些方法都写成单独的类,继承自ShowAction,包含唯一的方法,Show.每一次解析到一个字符串的时候,到一个Hashtable里去查看是否包含了这个字符串的键,如果包含了,就把对应的值转换成ShowAction类,然后调用它的Show方法,如果没有包含,就生成一次,然后加入到这个Hashtable中去.
我能想到的方法就是这样了,不知道是否会有什么问题,或者有什么更好的缓存方案?
另一个更高难度的问题是,我想让用户自己定义要显示的字段,比如这个ArticleList,他可以控制里面的格式显示文章标题,发表时间,或者用户名,或者摘要,或者点击数,回复数等等,如果拿出里面的模板文件,把所有的Article包含的属性都查找替换一遍的话,也太浪费了.因为一个Article可能包含30几个可用字段,而这里只用到其中两三个.所以我想同样采用上面这个方式:
给Article类添加父类Entity,在拿到ShowNewArticleList所指定的模板文件以后,先在模板里面找字符串定义,比如Article.Title,然后根据这个字符串,使用反射,在Load出来的Article对象里面查找这个属性,然后替换这个值.
如果这一步不能缓存的话,我想它的效率不会比替换所有可能的字符串更高,但是通过反射得到的同一个类不同对象的字段属性以及取该字段属性的调用方法,如何缓存呢?我还没有想到任何解决方案.