2009-09-19 137 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