自动区分MEF中的呼叫者

时间:2010-11-10 13:10:27

标签: c# metadata mef

从导出器内部使用MEF,是否可以使用元数据找出谁是导入者?

例如这是可能的:

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

这样导入者不需要传递某些东西(他的名字,这里)来告诉出口商谁是他。

1 个答案:

答案 0 :(得分: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)替换它们,消除了导入/导出属性中那些讨厌字符串的需求。