2009-09-19 97 views
5

我正在构建一个索引了几个不同数据源的搜索应用程序。当针对搜索引擎索引执行查询时,每个搜索结果指定它来自哪个数据源。我已经构建了一个工厂模式,用于为每种搜索结果显示不同的模板,但是我意识到,随着越来越多的数据源被搜索引擎编入索引,这种模式将变得更加难以管理(即新代码模板必须为每个新的数据源创建)。C#工厂模式

我创造了我厂根据关闭的威巴尼特的文章的结构如下超过在DotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

为了使这种搜索应用程序更易于维护,我的想法是,打造一个集可用于定义我的工厂模式可引用的个别模板类型以确定要构建哪个模板的数据库表。我想我需要有一个查找表,用来指定基于搜索结果数据源构建的模板类型。然后,我需要有一个表来指定为那个模板类型显示哪些字段。我还需要一个表格(或模板表格中的其他列),用于定义如何渲染该字段(即超链接,标签,CssClass等)。

有没有人有这样的模式的任何例子?请告诉我。 谢谢, - 罗伯特

回答

4

我会提议,这个建议的解决方案不会比简单地将数据源关联到代码模板,就像你现在有。事实上,我甚至会说通过将模板模式和渲染信息推送到数据库会失去灵活性,这会使应用程序难以维护。

例如,假设你有属性的这些数据源(如果我正确理解这一点):

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文件中,这可能更易于部署。

+0

再次感谢您的解释。获得另一套眼睛和意见总是很好的!你的想法给了我更多的想法来考虑。再次感谢。 - 罗伯特 – 2009-09-20 22:55:40