2014-02-26 68 views
2

我目前正在嘗試用MEF構建一個簡單的概念驗證,但是我無法使其工作。我在我的解決方案中有三個項目:MEF部分只有在有導出定義時才被發現

  • 定義簡單類的可移植類庫(我們在這裏稱它爲Component)。
  • 限定其從按鈕派生的類,並聲明 Component類型標有一個 Import屬性的屬性
  • 甲.NET庫:

    public class ComponentButton : Button 
    { 
        [Import] 
        public Component Component { get; set; } 
    } 
    
  • 一個WPF應用程序,其主窗口具有類型的屬性ComponentButton(標記爲Export),它在構造函數中初始化。然後,我想使用MEF這個組件分配給顯示在窗口中(目前唯一一個在XAML定義)的所有按鈕:

    [Export] 
    public Component Component { get; private set; } 
    
    public MainWindow() 
    { 
        InitializeComponent(); 
    
        this.Component = new Component(); 
    
        var container = new CompositionContainer(new DirectoryCatalog(".", "*")); 
    
        try 
        { 
         container.ComposeParts(this); 
        } 
        catch (CompositionException compositionException) 
        { 
         Debugger.Break(); 
        } 
    } 
    

但是,這是行不通的。沒有拋出異常,但組件未分配給按鈕。當我查看調試器中的目錄時,我可以看到,當所有程序集都加載並找到ExportDefinition時,它找不到導入定義。但真正讓我困惑的是,當我增加一個出口按鈕,它突然檢測到按鈕的出口和進口兩種:

[Export] 
public string Dummy { get; set; } 

但即便如此,它仍然沒有分量分配給按鈕。這是怎麼回事?

回答

1

由於按鈕是由WPF(通過調用InitializeComponent)而不是由MEF創建的,因此未設置按鈕的屬性。從理論上講,你可以遍歷視覺樹,併爲每個對象調用container.SatisfyImportsOnce(obj),但這樣做在性能方面會是一件可怕的事情。

一個解決方案是像綁定一樣設置屬性。但是,可以讓按鈕執行自我組合。你必須以某種方式暴露容器(通過一個靜態屬性爲例),並有按鈕呼叫SatisfyImportsOnce本身在構造函數中:

Global.MyCompositionContainer.SatisfyImportsOnce(this); 

This question可能會有所幫助。

相關問題