1
使用MEF,可以從出口者內部使用元數據找出誰是導入者?自動區分MEF中的呼叫者
例如這是可能的:
[Export("Config")]
String Config()
{
if (importer.metedata["name"] == "Circle")
return "R=10";
}
這樣進口商並不需要傳遞的東西(他的名字,在這裏),告訴他是誰的出口商。
使用MEF,可以從出口者內部使用元數據找出誰是導入者?自動區分MEF中的呼叫者
例如這是可能的:
[Export("Config")]
String Config()
{
if (importer.metedata["name"] == "Circle")
return "R=10";
}
這樣進口商並不需要傳遞的東西(他的名字,在這裏),告訴他是誰的出口商。
不,你不能那樣做。它更有意義,這樣做:
[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.Action
或System.Func
)是快速和骯髒的方式。
最好聲明一個IConfigurationProvider
接口,並在類級別上導出該接口。這有兩個好處:
typeof(IConfigurationProvider)
來消除導入/導出屬性中那些煩人的字符串的需求。
這應該可以工作,但是你不需要'name'參數的'Import'屬性嗎?否則,它將如何知道應該傳遞什麼值? – casperOne 2010-11-10 14:00:20
@casperOne:否。這裏輸出的是一個'System.Func'。我已經添加了一個導入類的例子來澄清事情。 –
2010-11-10 14:15:27
我曾考慮過它,但這是違反解耦的。如果不能自動完成,我更願意將配置作爲合同的一部分傳遞給合同。通過這種方式,出口商知道誰在輸入數據,但這與IoC相反。 – Xaqron 2010-11-11 15:28:15