2008-12-09 79 views
0

我正在製作由屏幕(演示者+視圖)組成的WPF應用程序。我希望能夠在配置文件或SQL數據庫中聲明這些屏幕。我一直試圖想出一個我已經放棄的好解決方案,並且問你們有些人是如何設計這種事情的?我一直在這工作了一個多星期,每一個解決方案都會產生很多不愉快的結果。聲明演示者和視圖

在我的WPF應用程序中,我有一個表示屏幕的樹形視圖。當用戶點擊一個節點時,屏幕被加載。我希望能夠從配置文件或數據庫中填充treenodes。該程序不應該關心這些存儲在哪裏,所以我可以換出數據庫存儲的配置存儲。如果我存儲了屏幕信息,我也可以使用IOC容器爲我實例化屏幕並按名稱檢索它們。這裏是我想出了配置文件模式的一個樣本:

<screen name="" title="" presenterType="" viewType=""/> 
<screen ...> 
    <screen .../> 
    <screen .../> 
</screen> 
<screen .../> 

我想出了最新的解決方案是使用一個要求ScreenInfo對象ScreenRepository一個ScreenService。然後,我將能夠使用此信息填充樹視圖和IOC容器。

這聽起來像是一個很好的解決方案嗎?你會做什麼不同?而且,您如何在自己的編程中設計這種系統?

回答

0

當您將對象從工廠方法返回時,還可以包含層次結構。例如,我的形狀工廠有兩個方法一個返回一個添加到主列表中的形狀列表,另一個返回形狀庫。雖然用戶可以定義和更改實際庫,但我有一個自動生成的默認設置用於故障排除和初始安裝。它是分層的。

但是ShapeLibrary由ShapeLibraryItem組成。一個ShapeLibraryItem有一個與它一起存儲的密鑰,所以它可以將形狀拉出主程序列表。因此點擊一個按鈕或項目,它會查看它所關聯的ShapeLibrary項目。獲取鑰匙,使用鑰匙獲取形狀程序,然後使用UI界面繪製屏幕。

如果您的屏幕將層次結構信息嵌入爲其衆多屬性之一,那麼我建議您將其分離爲層次結構項目。然後可以創建由HierarchyLists或HierarchyItem組成的HierarchyList。我會製作一個IHierarchyItem接口,以便HierarchyLists看起來像一個項目。

主要區別是行爲。當你點擊一個HeirarchyList時會出現另一個列表(或展開等),一個真實的Item將會彈出一個屏幕。

所以你的程序集將有兩個類標有兩個屬性之一。一個是ScreenFactory,另一個是HierarchyFactory。

請注意,您不必使用可直接將HierarchyItem鏈接到形狀的鍵。我使用GUID鍵來避免每次都耦合。耦合並不總是不好,但也不總是好。由於GUID是獨一無二的,因此它的工作原理也是一樣的

至於性能,你會有數百個彙編之前,你會注意到它。請記住,您不必爲每個屏幕都安裝一個程序集。只要把它們合理地分成幾個組件,你就可以走了。

0

一般來說,您需要爲這些類型的情況使用工廠模式。 ScreenService,ScreenRepository和Screeninfo的組合聽起來就像你釘住了它。 Here是什麼是工廠模式的基本概述。您可以使用維基百科文章作爲出發點,查看是否有任何變化或您錯過的方面。

我設計並維護了一個CAD/CAM應用程序,該應用程序包含幾個預覽參數化圖形庫,用戶可以輸入幾個維度並計算切割的形狀。每個形狀都有自己的屏幕設置。在我的應用程序啓動期間,我使用了類似的模式。

我掃描每個裝配體的形狀庫目錄,挑選出具有檢索形狀列表的方法的工廠類,並將其加載到主列表中。當用戶點擊工具欄按鈕或從列表中選擇時,軟件會使用一個按鍵將正確的形狀從列表中提取出來,從而展示IShapeScreen界面。管理形狀的表單使用該接口爲該形狀繪製正確的輸入屏幕。

這種方法已經工作了近十年,沒有任何重大問題,同樣重要的是沒有給我留下一個「哦,我希望我設計它的時候這樣做」的感覺。所以我認爲你是在正確的軌道上。

請注意,您可能不需要使用基於文本的配置文件。使用屬性,您定義的一些接口和.NET反射API,您可以將DLL引入目錄,軟件可以掃描該目錄並正確拉入所需的對象。在你的案例屏幕對象。但是,如果您希望人員編輯配置,那麼肯定會要求基於文本的文件。我假設你在使用.NET標記時使用.NET API。

0

對不起,我應該提到我使用.NET 3.5。我很習慣在ASP.NET論壇發帖,我忘了。

我喜歡掃描程序集的想法,但我希望將它定義爲填充樹視圖的層次結構。另外,與配置文件或數據庫相比,使用反射來掃描程序集會有什麼性能損失?這是一個明顯的差異,或者很小,沒有人能夠說出來嗎?

我創建的應用程序將在我們公司內部使用。它需要有一個用於導航的分層結構,因此我們的屏幕很容易找到。掃描一個程序集文件夾會很好,因爲我們可以創建一個模塊並通過它進入該文件夾,該應用程序會自動提取它。這會導致以分層方式表示屏幕的問題。此外,我們希望實施授權,以便用戶只能看到允許使用的屏幕。

感謝您的回覆。我喜歡看別人如何做事。它幫助我瞭解了很多這些設計概念,因爲我剛剛開始設計模式的路徑(只訂購了PEAA書籍)。其他人請分享您的想法。它也可能幫助像我這樣的人絆倒這個問題。

相關問題