我會提議,這個建議的解決方案不會比簡單地將數據源關聯到代碼模板,就像你現在有。事實上,我甚至會說通過將模板模式和渲染信息推送到數據庫會失去靈活性,這會使應用程序難以維護。
例如,假設你有屬性的這些數據源(如果我正確理解這一點):
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