簡體   English   中英

C#工廠模式

[英]C# Factory Pattern

我正在構建一個索引幾個不同數據源的搜索應用程序。 當針對搜索引擎索引執行查詢時,每個搜索結果指定它來自哪個數據源。 我已經構建了一個工廠模式,我用它為每種類型的搜索結果顯示不同的模板,但我意識到這種模式將變得更難以管理,因為越來越多的數據源被搜索引擎索引(即新的必須為每個新數據源創建代碼模板。

我根據Granville Barnett在DotNetSlackers.com上發表的一篇文章為我的工廠創建了以下結構

工廠模式http://img11.imageshack.us/img11/8382/factoryi.jpg

為了使這個搜索應用程序更易於維護,我的想法是創建一組數據庫表,可用於定義我的工廠模式可以引用的各個模板類型,以確定要構造的模板。 我想我需要有一個查找表,用於根據搜索結果數據源指定要構建的模板類型。 然后,我需要有一個表來指定要為該模板類型顯示的字段。 我還需要一個表(或模板表中的其他列),用於定義如何呈現該字段(即超鏈接,標簽,CssClass等)。

有沒有人有這樣的模式的例子? 請告訴我。 謝謝,-Robert

我建議這個提議的解決方案不僅僅是簡單地將數據源與代碼模板相關聯,就像你現在所擁有的那樣。 實際上,我甚至會說通過推送模板架構和將信息呈現到數據庫來失去靈活性,這將使您的應用程序更難維護。

例如,假設您有這些具有屬性的數據源(如果我正確理解這一點):

Document { Author, DateModified }
Picture { Size, Caption, Image }
Song { Artist, Length, AlbumCover }

然后,您可以在搜索結果中包含其中一個數據源。 每個元素的呈現方式都不同(圖片可以使用固定在左側的預覽圖像進行渲染,或者歌曲可以顯示專輯封面等)

讓我們看看你提出的設計下的渲染。 您將查詢數據庫中的渲染,然后調整您正在發出的一些HTML,比如因為您想要一個綠色背景的文檔和一個藍色的圖片。 為了爭論,讓我們說你意識到你真的需要三種背景顏色的歌曲,兩種用於圖片,一種用於文檔。 現在,除了更改要應用渲染值的參數化模板之外,您還在查看數據庫模式更改(已提升並推出)。

讓我們進一步說你決定Document結果需要一個下拉控件,Picture需要幾個按鈕,而歌曲需要一個聲音播放器控件。 現在,每個數據源的每個模板都會發生巨大變化,所以你就可以回到原來的位置了,除非你現在有一個數據庫層。

這就是設計中斷的方式,因為您現在已經失去了為每個數據源定義不同模板的靈活性。 您丟失的另一件事是在源代碼管理中對模板進行版本控制。

我將看看如何在發出的視圖中重用通用元素/控件,但是在工廠中保留模板和數據源之間的映射,並將模板作為單獨的文件保存在每個數據源中。 看看通過CSS或類似的配置設置維護渲染。 考慮將映射作為簡單的XML文件導出,使其更易於維護。 要部署新數據源,只需添加映射,創建相應的模板和CSS文件,然后將它們放入預期的位置。

回復以下評論:

我的意思是一個簡單的switch語句就足夠了:

switch (resultType)
{
    case (ResultType.Song):
      factory = new SongResultFactory();
      template = factory.BuildResult();
      break;
    // ...

您有邏輯輸出給定模板的位置。 如果你想要一個比long switch語句更緊湊的東西,你可以在字典中創建映射,如下所示:

IDictionary<ResultType, ResultFactory> TemplateMap;
mapping = new Dictionary<ResultType, ResultFactory>();
mapping.Add(ResultType.Song, new SongResultFactory());
// ... for all mappings.

然后,您可以執行以下操作,而不是使用switch語句:

template = TemplateMap[resultType].CreateTemplate();

我的主要論點是,在某些時候你仍然需要維護映射 - 無論是在數據庫中,是一個大的switch語句,還是需要初始化的這個IDictionary實例。

您可以進一步將映射存儲在一個簡單的XML文件中,該文件可以讀入:

<TemplateMap>
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
    <!-- ... -->
</TemplateMap>

並使用反射等。 人。 填充IDictionary。 您仍在維護映射,但現在在XML文件中,可能更容易部署。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM