【问题标题】:MEF: how to import from an exported object?MEF:如何从导出的对象导入?
【发布时间】:2010-08-06 16:11:23
【问题描述】:

我创建了一个 MEF 插件控件,并将其导入到我的应用程序中。现在,我希望插件能够从应用程序中导入部件。我不知道如何在插件中设置目录,以便它可以从应用程序中找到导出。有人能告诉我这是怎么做到的吗?下面是我的代码,当我尝试使用当前正在执行的程序集创建一个 AssemblyCatalog 时它不起作用。

[Export(typeof(IPluginControl))]
public partial class MyPluginControl : UserControl, IPluginControl

    [Import]
    public string Message { get; set; }


    public MyPluginControl()
    {
        InitializeComponent();
        Initialize();
    }

    private void Initialize()
    {
        AggregateCatalog catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        CompositionContainer container = new CompositionContainer(catalog);
        try
        {
            container.ComposeParts(this);
        }
        catch (CompositionException ex)
        {
            Console.WriteLine(ex.ToString());
        }

    }
}

【问题讨论】:

    标签: import assemblies export mef


    【解决方案1】:

    你不需要这样做。

    只需确保您在导入此插件时使用的目录包含主应用程序的程序集。

    当 MEF 构造您的类型以导出它(以在其他地方完成 IPluginControl 导入)时,它已经为您组成了这部分 - 并且此时,将导入“消息”字符串(不过,您很可能应该为该“消息”分配一个名称,或者某种自定义类型 - 否则,它只会导入一个字符串,而您只能在应用程序的任何地方使用单个“字符串”导出)。

    当 MEF 组合部件时,它会查找与指定类型匹配的所有类型(在本例中为 IPluginControl),实例化单个对象,满足该对象的任何 [Import] 要求(这就是您不需要组合的原因this 在您的构造函数中),然后将其分配给导入该类型的任何对象。

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 1970-01-01
      • 2012-01-07
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多