2011-01-22 42 views
1

是否有可能從導入的MEF類型獲取程序集信息,而不實例化類型?我需要知道包含Type的插件控件的程序集名稱和版本。嘗試了以下,但它只是返回System.ComponentModel.Composition。如何通過MEF獲取導入的UserControl的程序集信息,而不實例化UserControl?

foreach (Lazy<UserControl, IMetadata> content in contents) 
{ 
    // get assembly information of the Plugin control for the imported function 
    string definingAssembly = content.GetType().Assembly.GetName(); 
    Console.WriteLine(definingAssembly); 
} 

爲了儘可能避免維護問題,我想避免在元數據中指定這些信息。

回答

0

你試過的應該會失敗,因爲程序集永遠都不能成爲動態加載的模塊程序集。

我想如果你沒有實例化一個類型,那個模塊程序集甚至沒有加載到內存中。

您是否嘗試發佈到MEF討論區?在那裏你可能會遇見開發者。

http://mef.codeplex.com/discussions

2

這是一個常見問題是pops up on the MEF forum飄飛。 (我確信有幾個更好的線程包含答案,但我無法立即找到)。

MEF不支持檢查延遲導入的零件類型(不實例化該零件)。這是因爲它的設計理念兩個元素的可能:

  1. MEF鼓勵鬆耦合。您應該根據合約指定和使用導入。依靠導入的實際類別類型會阻止您在將來更改構圖。

  2. MEF允許延遲加載類型。假設將會有一個Lazy.PartType屬性,您可以使用它來檢查該零件的實際類型。這將強制加載零件類型和包含的組件。然後你根據PartType決定你不想實例化那個特定的零件,並且零件的裝載是沒有用的。 (據我所知,目前MEF尚未利用第二個設計功能,AssemblyCatalog將在調用AssemblyCatalog.Parts時立即檢查所有類型,但在MEF源代碼中有一個示例顯示如何緩存有關組件推遲或避免組件負載信息。)

因此,而不是依賴於準確類型的一部分,你應該補充一點,你可以用做一個進口選擇一些元數據。

0

我一直在想這個問題,因爲我自己遇到了這個問題。我想根據需求創建實例,而不是通過構圖爲我創建實例。

我的場景是我不需要知道特定的類型,但我可能需要創建該類型的多個實例,使用它們,並在適當時處理它們。我提出的解決方案不是使用MEF加載具體類型,而是強制讓它爲我創建實例,使用MEF加載知道如何創建我想控制類型的實例的工廠。

MEF會加載並創建工廠,然後我可以使用工廠來創建我可以隨意使用和處理的實例。