代码之家  ›  专栏  ›  技术社区  ›  Xaqron

MEF中自动区分呼叫者

  •  1
  • Xaqron  · 技术社区  · 14 年前

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

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

    这样进口商就不需要传递什么(他的名字,这里)来告诉出口商他是谁。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Wim Coenen    14 年前

    不,你不能那样做。这样做更有意义:

    [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)