2010-04-25 57 views
0

我正在瀏覽Unity 2.0以檢查它是否在我們的新應用程序中有效使用。我的應用程序是Windows Forms應用程序,目前使用傳統的酒吧菜單(位於頂部)。在動態菜單中應用Unity

我的UI(Windows窗體)或多或少支持依賴注入模式,因爲它們都通過構造函數提供給它們的類(Presentation Model Class)。表單然後綁定到提供的P Model類的屬性並調用P Model類中的方法來執行其職責。非常簡單直接。

P模型如何對UI動作作出反應,並通過協調域類(業務邏輯/模型)對它們做出響應在此處不相關,因此未提及。

對象的創建順序顯示一個UI從菜單則是這樣的 -

  1. 創建商業模式的實例
  2. 創建商業模式的實例傳遞至P型構造演示模型實例。
  3. 使用傳遞給UI構造函數的Presentation Model實例創建UI實例。

我目前的解決方案:

要顯示在上面,從我的菜單我會從我的菜單類是指所有組件(業務,PModel,UI)的方法的UI。考慮到我已經將模塊拆分爲多個物理組件,那麼添加對大約60個不同組件的引用將是一項艱鉅的任務。此外,這種方法的可擴展性不是很好,因爲我肯定需要發佈更多的模塊,並且通過這種方法,我每次發佈新模塊時都必須更改源代碼。

所以主要是爲了避免如此多的組件從我的菜單類(組裝)參考我做了如下 -

上面存儲在數據庫表(SQL Server)的描述的所有依賴,例如

ModuleShortCode | BModelAssembly | BModelFullTypeName | PModelAssembly | PModelFullTypeName | UIAssembly | UIFullTypeName

現在使用名爲「啓動器」帶方法「啓動」靜態類,如下 -

Launcher.Launch("Discount"); 
Launcher.Launch("Customers"); 

啓動程序在內部從依賴關係表使用數據,並使用Activator.CreateInstance()來創建每個對象並將該實例用作構造函數參數,直到創建UI爲止。 UI然後顯示爲模態對話框。啓動器內的代碼有點像 -

Form frm = ResolveForm("Discount"); 
frm.ShowDialog();` 

ResolveForm可以完成構建對象鏈的技巧。

Unity可以幫助我嗎?

現在當我這樣做時,我沒有足夠的關於Unity的信息,現在我已經學習了Unity,我認爲我一直在做或多或少的相同的事情。所以我試圖用Unity代替我的代碼。

但是,一旦我開始我打了一個街區。如果我嘗試在我的菜單來解決UI形式

Form customers = myUnityContainer.Resolve<Customers>(); 

Form customers = myUnityContainer.Resolve(typeof(Customers)); 

然後無論哪種方式,我需要從我的菜單組件是指我的UI組件,因爲目標類型「客戶」需要以Unity着稱解決它。所以我回到了同一個地方,因爲我不得不從菜單程序集中引用所有UI組件。據我所知,使用Unity我都將不得不提及較少的組件(只UI組件),但需要這些引用這違背了我下面的目標 -

  1. 動態,而不從菜單裝配任意組裝的參考對象創建的鏈條。這是爲了避免每次釋放新模塊時更改菜單源代碼。我的菜單也是從表格動態構建的。

  2. 只需提供新的程序集並通過數據庫補丁程序在表中插入新的Dependency行,就能夠提供新的模塊。

在這個階段,我有一種感覺,我必須這樣做,即Activator.CreateInstance()來完成我所有的目標。我需要驗證社區是否像我一樣思考或者有更好的建議來解決問題。

該帖子真的很長,我真誠地感謝你,如果你來到這一點。等待您的寶貴建議。

  • Rajarshi

回答

0

,我可以從這段代碼

Form customers = myUnityContainer.Resolve<Customers>(); 

所有的代碼需要知道顧客看的 - 是它的一個Form類。所以,如果你使用XML配置統一,你可以做到以下幾點:

<type type="Form" mapTo="Customer" name="Customer"> 
</type> 

然後你就可以解決這個問題是這樣的:

Form customers = myUnityContainer.Resolve<Form>("Customer"); 

,也沒有必要REFFERENCE您的UI部件。它應該出現在bin目錄或GAC中。在這種情況下,如果您要開發新的Assembly,您只需要更改config並將其放入bin或gac。

如果你想從db進行統一配置,那麼你必須添加引用到你的UI,因爲你必須調用Register(「Customer」)。

+0

太棒了!這是我忽略的一個有趣的信息。沒有時間測試,但它應該工作。非常感謝。 – Rajarshi 2010-04-28 09:01:02

+0

沒有時間檢查代碼,現在檢查。它工作順利。它解決了引用太多程序集和提供新程序集的主要問題。謝謝。 – Rajarshi 2010-05-08 07:37:59