2012-02-08 41 views
2

大家攔截在MEF組成和導入選擇

的問題是,如果存在具有相同出口的簽名,但只有一個應導入(這是可能的兩個出口元件,實際的例子是安裝新插件來替換舊的一個沒有卸載舊的。)。我們可以提供一個配置文件來告訴哪個組件應該被導入,但問題是如何告訴MEF正確的選擇?

我有三個方法:

  1. 使用自定義的目錄,篩選可用的插件。但假設A導入組件A和B時導入組件B,而組件A和B具有相同的導出簽名。除非我們爲每個組件創建新的自定義目錄,否則自定義目錄無法處理此問題。

  2. MEF構圖中的截取。我不確定這是否可能,我不知道如何。但是,如果我們在構圖過程中攔截,這可能是最好的一種。

  3. 使用導入包裝而不是真實接口。當組件構成,它將初始化包裝並讓包裝處理選擇邏輯(如提示一個窗口,並讓用戶選擇一個或讀取配置)

回答

2

什麼有關使用[ImportMany]至爲相同的簽名獲取所有可能的導入,然後從該導入列表中選擇一個您想要的條件(配置文件或其他內容)?

編輯:我喜歡你的建議3號,我認爲這可能很容易。你的包裝處理與[ImportMany]真正的接口和插件要求你的包裝GetTheOneInterface()。

+0

是的,[ImportMany]可以解決,但這會強制所有組合組件處理插件選擇邏輯本身。我試圖避免這一點。 – 2012-02-08 06:43:00

+0

請參閱http://stackoverflow.com/questions/7750640/intercepting-dependencies-in-mef,這可能有所幫助,實施ExportProvider可能會遇到鏈接方法2 – 2012-02-08 07:56:11

+0

thx。如果你有你的東西工作,請發佈這裏作爲答案。 – blindmeis 2012-02-08 09:35:46