2010-11-10 81 views
1

使用MEF,可以從出口者內部使用元數據找出誰是導入者?自動區分MEF中的呼叫者

例如這是可能的:

[Export("Config")] 
String Config() 
{ 
    if (importer.metedata["name"] == "Circle") 
    return "R=10"; 
} 

這樣進口商並不需要傳遞的東西(他的名字,在這裏),告訴他是誰的出口商。

回答

1

不,你不能那樣做。它更有意義,這樣做:

[Export("Config")] 
string GetConfigurationValue(string name) 
{ 
    if (name == "Circle") 
    { 
     return "R=10"; 
    } 
    throw new ArgumentException(
     string.Format("Unknown configuration value '{0}'", name)); 
} 

和進口這種方法可能看起來像這樣的類:

[Export(typeof(IDrawer))] 
public class CircleDrawer : IDrawer 
{ 
    [Import("Config")] 
    public Func<string,string> ConfigGetter { get; set; } 

    public void Draw() 
    { 
     string configuration = this.ConfigGetter("Circle"); 
     ... 
    } 
} 

注意,直接導入和導出方法(System.ActionSystem.Func)是快速和骯髒的方式。

最好聲明一個IConfigurationProvider接口,並在類級別上導出該接口。這有兩個好處:

  • 接口文檔是您可以在其中記錄進口商和出口商必須達成一致的合同的地方。
  • 它通過替換typeof(IConfigurationProvider)來消除導入/導出屬性中那些煩人的字符串的需求。
+0

這應該可以工作,但是你不需要'name'參數的'Import'屬性嗎?否則,它將如何知道應該傳遞什麼值? – casperOne 2010-11-10 14:00:20

+0

@casperOne:否。這裏輸出的是一個'System.Func '。我已經添加了一個導入類的例子來澄清事情。 – 2010-11-10 14:15:27

+0

我曾考慮過它,但這是違反解耦的。如果不能自動完成,我更願意將配置作爲合同的一部分傳遞給合同。通過這種方式,出口商知道誰在輸入數據,但這與IoC相反。 – Xaqron 2010-11-11 15:28:15