我会提议,这个建议的解决方案不会比简单地将数据源关联到代码模板,就像你现在有。事实上,我甚至会说通过将模板模式和渲染信息推送到数据库会失去灵活性,这会使应用程序难以维护。
例如,假设你有属性的这些数据源(如果我正确理解这一点):
Document { Author, DateModified }
Picture { Size, Caption, Image }
Song { Artist, Length, AlbumCover }
然后你可以在你的搜索结果中的每个这些数据源之一。每个元素的渲染方式都不相同(可以使用锚定在左侧的预览图像渲染图片,或者宋可以显示专辑封面等)
让我们来看看您的建议设计下的渲染。你将要查询数据库的渲染,然后调整一些你正在发射的HTML,比如说你想要一个绿色的背景文件和一个蓝色的图片。为了争辩,让我们假设你意识到你真的需要三种背景颜色来表示歌曲,两种是图片,另一种是文档。现在,您正在查看数据库模式更改,除了更改要应用呈现值的参数化模板之外,还会提升和推出数据库模式更改。
让我们进一步说,你决定文档结果需要下拉控件,图片需要几个按钮,歌曲需要声音播放器控制。现在,每个数据源的每个模板发生了巨大变化,因此您刚刚开始的位置已经恢复正常,除了现在您已经引入了数据库层。
这是设计如何破坏的原因,因为您现在失去了灵活性为每个数据源定义不同的模板。你失去的另一件事是在源代码控制中对你的模板进行版本控制。
我会研究如何在发射视图中重用常用元素/控件,但保留模板和数据源之间的工厂映射关系,并将模板保存为每个数据源的单独文件。看看通过CSS或类似的配置设置来维护渲染。为了更容易维护,考虑将映射导出为简单的XML文件。要部署新的数据源,只需添加一个映射,创建适当的模板和CSS文件,然后将它们放入预期的位置。
应对下面的注释:
我的意思是一个简单的开关语句应该足够了:
switch (resultType)
{
case (ResultType.Song):
factory = new SongResultFactory();
template = factory.BuildResult();
break;
// ...
如果你有逻辑输出给定模板。然后
IDictionary<ResultType, ResultFactory> TemplateMap;
mapping = new Dictionary<ResultType, ResultFactory>();
mapping.Add(ResultType.Song, new SongResultFactory());
// ... for all mappings.
,而不是一个switch语句,你可以做到这一点的一行:如果你想要的东西不是很长的switch语句更加紧凑,你可以在字典中创建的映射,这样
template = TemplateMap[resultType].CreateTemplate();
我的主要观点是,在某些时候,您仍然需要维护映射 - 无论是在数据库,大型switch语句还是需要初始化的此IDictionary实例。
您可以进一步把它和存储在阅读一个简单的XML文件的映射:
<TemplateMap>
<Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
<!-- ... -->
</TemplateMap>
而且使用反射等。人。填充IDictionary。你仍然在维护映射,但现在在一个XML文件中,这可能更易于部署。
再次感谢您的解释。获得另一套眼睛和意见总是很好的!你的想法给了我更多的想法来考虑。再次感谢。 - 罗伯特 – 2009-09-20 22:55:40