2013-05-17 33 views
1

我想在我定義的類中獲取導出的屬性,但我認爲某些東西是我不知道的。這裏是我的處理程序類:C#:MEF導出屬性

public class Handler 
{ 
    public string Message { get; private set; } 
    public void Create(string msg) 
    { 
     Message = msg; 
    } 
} 

我HandlerUser類是:

public class HandlerUser 
{ 
    [Export(typeof(Handler))] 
    public Handler MyHandler { get; set; } 
    public string Name { get; set; } 

    public HandlerUser() { MyHandler = new Handler(); } 
} 

在我的Program.cs我:

 var catalogs = new AggregateCatalog(); 
     var catalog = new ApplicationCatalog(); 
     catalogs.Catalogs.Add(catalog); 

     CompositionContainer pluginsCompositionContainer = new CompositionContainer(catalogs); 

     HandlerUser u1 = new HandlerUser(); 
     u1.MyHandler.Create("U1"); 
     HandlerUser u2 = new HandlerUser(); 
     u2.MyHandler.Create("U2"); 

     var exports = pluginsCompositionContainer.GetExports<Handler>(); 
     Console.Write(exports.Count()); 

我希望看到2個出口,他們應該有「U1」,「U2」作爲他們的消息,但是我只看到一個,並且消息是空的。我無法弄清楚缺少什麼,我簡單地想要在代碼中做出每個Handler的導出,並且能夠做一些邏輯。任何幫助都會很棒。

+0

你有沒有得到它的工作? –

+0

感謝您的回答,但該解決方案正是我用於'導出'當前的MEF類。把'Handle'類看作一個錯誤收集機制。我在MEF導出項目中創建'Handle'類的實例,因此除了獲取對MEF導出類的引用外,我想要一個ErrorManager來收集所有導出的錯誤日誌。換句話說,我在'HandlerUser'類中導出了兩種不同類型的信息。一個是實際實現的原始輸出,另一個是Handler類的其他實例。 – aminjam

回答

1

當使用MEF,你不能,你需要導出類本身,所以你的代碼應該是這樣的一些出口類的屬性或方法(類型):

[Export(typeof(Handler))] 
    public class HandlerUser : Handler 
    { 
     public string Name { get; set; } 

     public HandlerUser() : base() 
     { 
     } 
    } 

但因爲你正在使用MEF,這意味着您正在嘗試爲您的應用程序添加可擴展性,考慮到這一點,我將「處理」一個接口而不是一個類,這樣任何人都可以實現他們想要的方式,他們只需要實現接口。

在這種情況下,會是這樣的:

編輯:

我已經更新了答案清楚如何MEF作品與出口,你實際上可以導出屬性,但不是在問題的背景下。當你這樣做時,你將通過屬性名稱「Handler」來導出,而不是像類定義中那樣使用typeof(Handler)。屬性和方法導出是一個很酷的功能,但是有一些限制(方法導出的最大參數數量是4!),如果可能,更喜歡類導出。使用MEF出口

的更多信息,可以發現here

+4

你錯了 - 導出對於屬性和方法都是可能的。 –

+0

不,導出在此上下文中不可用,他想導出該類,以便通過類型定義獲取它們。導出確實適用於屬性,但是您導出的是字符串而不是類型,它們的聲明是不同的。但我會更新答案以使其更清楚。 –

+3

可以通過具有兩個導出屬性來導出類的兩個實例,其中getters返回完全構造的對象。不是說要走的路,而是有可能的。 –

0

,你看到的只是一個出口是因爲CompositionContainer不知道你自己創建的另外兩個對象的原因。

要讓CompositionContainer使用另外兩個Handlers,請將每個HandleUser傳遞給CompositionContainer.ComposeParts方法。這個將把處理程序註冊到容器中。

pluginsCompositionContainer.ComposeParts(u1); 
pluginsCompositionContainer.ComposeParts(u2); 

然後當你出口,你會發現,他們並不是兩個(如你最初的預期),但三。您自己創建並使用CompositionContainer.ComposeParts加上容器自動創建的那個(實際上是Lazy<Handler>)註冊到容器中的兩個。最後一個是你在示例代碼中看到的那個。當您嘗試訪問此特定導出值時,容器將創建一個HandlerUser的實例,然後將引用返回給Handler