MEF:如何从导出的对象导入?

时间:2010-08-06 16:11:23

标签: import assemblies export mef

我创建了一个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());
        }

    }
}

1 个答案:

答案 0 :(得分:2)

您不需要这样做。

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

当MEF构造你的类型以便导出它时(为了在其他地方完成IPluginControl导入),它已经为你编写了这部分 - 并且在那时,将导入“消息”字符串(尽管,您最有可能为该“消息”指定一个名称,或者某种类型的自定义类型 - 否则,它只会导入一个字符串,并且您只能在应用程序的任何位置使用单个“字符串”导出。 / p>

当MEF组成部件时,它会找到与指定类型匹配的所有类型(在本例中为IPluginControl),实例化单个对象,填充该对象的任何[Import]要求(这就是为什么你要'我需要在你的构造函数中组合它,然后将它分配给任何导入该类型的对象。