我正在開發與科學儀器交互的.Net桌面應用程序。這個工具有很多種不同的形式,每種都有不同的特性,組件等,所以我想出了一個插件/模塊化架構,其中「模塊組件」包含所有必要的業務邏輯,用戶界面等與該硬件組件/功能進行交互。模塊化應用程序體系結構和Castle Windsor
目前我有一個解決方案,包含所有內容 - 「核心」應用程序項目,公共庫和「模塊」項目。我們的想法是,我們將整批安裝到客戶站點(而不是挑選他們需要的DLL),並使用包含所需模塊列表的配置文件「激活」相關模塊。
主應用程序項目使用CastleFindsor使用AssemblyFilter和自定義InstallerFactory加載模塊。它搜索每個模塊組件,查找實現IWindsorInstaller
和的裝飾有特定自定義屬性(具有包含模塊名稱的屬性)的類。只有當屬性的模塊名稱是請求的模塊名稱時,模塊的安裝程序纔會運行。這些安裝程序類負責使用Windsor(業務邏輯,視圖,視圖模型等)註冊該模塊所需的所有內容。
該解決方案在我的概念證明中工作正常,但是我可以看到兩個或更多個模塊在功能上非常相似的情況,因此需要共享通用代碼。假設我有項目「ModuleA」和「ModuleB」,他們的Windsor安裝人員在項目「ClassLibraryX」中註冊了相同的IFooService
類。該應用程序將會崩潰,因爲IFooService已被重新編寫了兩次,而Windsor在構造函數請求時不會知道要解析哪一個。
處理這個問題的最佳方法是什麼?到目前爲止的想法: -
- 找出一個特定的組件是否已經在Windsor註冊過。這感覺hacky(如果可能的話)
- 使用名稱註冊組件,但我如何請求具有構造函數注入的命名實例?
- 在每個模塊項目中創建一個新界面,如
public interface IModuleAFooService : IFooService
,並在整個項目中註冊/使用此界面(而不是IFooService
)。
有什麼想法?
編輯:事實上,當Windsor嘗試分辨IFooService
時,它不會倒下。當第二個模塊嘗試註冊相同的接口/具體實現時,它會崩潰!
我也想過在「共享」程序集中安裝一個安裝程序,但我想這意味着要註冊這些共享組件,而不管是否有任何相關模塊已被「激活」。也許我只是從一座痣山上爬出一座山,而不必要的註冊(這在啓動時發生)的開銷很小。 –
是的,我認爲可用組件的註冊幾乎沒有開銷。我會這樣想:您正在激活可以使用的核心組件,但是每個模塊都會在執行之前確保它處於活動狀態。 –