2014-02-20 52 views
0

我在這裏是一個完整的初學者,所以這可能是一個非常明顯的問題,我似乎無法理解或找到答案。我已閱讀MSDN example,其中大部分內容完全合理。MEF元數據與價值

在這個例子中,他們定義了以下接口並給出了這樣的例子用法;

public interface IOperation 
{ 
    int Operate(int left, int right); 
} 

public interface IOperationData 
{ 
    char Symbol { get; } 
} 

[Export(typeof(IOperation))] 
[ExportMetadata("Symbol", '+')] 
public class Add : IOperation 
{ 
    public int Operate(int left, int right) 
    { 
     return left + right; 
    } 
} 

我想我在這裏一定是誤會。

  • IOperationDataExportMetadata是什麼意思?
  • 爲什麼我不能直接放下它們並將char Symbol {get;}加到IOperation

然後我可以使用Add.Value.Symbol而不是Add.Metadata.Smybol。我想這不是一個真正的巨大變化,但它確實意味着我不需要ExportMetadataValueMetadata之間有什麼區別,爲什麼示例使用它們呢?屬性爲Metadata,方法爲Value?它似乎沒有很好地向我解釋。

回答

2

MEF允許可組合部分提供它們的元數據。這裏的元數據是一組靜態已知的屬性,這對於部分類型而言是典型的,而不是用於實例的類型。

假設您在給定示例中正在構建計算器的GUI。
每個操作都是一個插件,通過MEF容器加載。你不想實例化每個插件直到用戶選擇,但你想用按鈕構建面板,其中每個按鈕都包含一個操作符號。

這就是爲什麼你需要使用的,而不是添加到char Symbol {get;}IOperation

  • 可以不用的部分實例訪問元數據(這可能是昂貴的);
  • 元數據屬於可組合部分,並且該部分的每個實例都應具有相同的元數據(儘管計算器示例不是理解該事實的理想選擇)。

您正在描述元數據接口IOperationData並將ExportMetadata屬性應用於可組合部件定義。然後,在運行時,MEF將查看Add類,並動態構建IOperationData實現。該實現的實例正在使用值進行初始化,在ExportMetadata中提供。最後,您可以稍後在主機應用程序中使用Add.Metadata.Smybol訪問IOperationData實現的值。

UPDATEExportMetadata允許你添加多個元數據值,但它往往是更方便的添加元數據,使用自定義屬性,它是從ExportAttribute繼承:

public interface IMyPlugin {} 
public interface IMyMetadata 
{ 
    int Value1 { get; } 
    string Value2 { get; } 
} 

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public sealed class MyExportAttribute : ExportAttribute, IMyMetadata 
{ 
    public MyExportAttribute(int value1, string value2) 
     : base(typeof(IMyPlugin)) 
    { 
     Value1 = value1; 
     Value2 = value2; 
    } 

    public int Value1 { get; private set; } 
    public string Value2 { get; private set; } 
} 

用法:

[MyExport(1, "Orange")] 
    public class MyPlugin : IMyPlugin {} 
+1

權,因此元數據是一種避免初始化的方法,但仍然可以獲得信息。這就說得通了。要補充一點,是否有可能有多個元數據值?我只是在第一個下面添加另一個ExportMetadata? – Trent

+0

是的,你可以添加另一個'ExportMetadata',這是做你想做的事情的方法之一。另一種方法是製作自己的'ExportAttribute'(我將在我的答案中添加示例)。 – Dennis

+0

太棒了。謝謝丹尼斯。 – Trent