MEF Contrib提供商模型不导入零件

时间:2010-01-09 19:05:08

标签: mef provider

我一直在尝试使用可配置的提供程序模型来处理MEF Contrib(link)的MEF导入和导出。我已经阅读了Codeplex文档和Code Junkie的博客文章(link);但是,我似乎无法让容器来创建零件。我哪里错了?

Program.cs的

namespace MEFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Run();
        }

        // [ImportMany("command", typeof(IHelp))]
        public IEnumerable<IHelp> Commands { get; set; }

        void Run()
        {
            Compose();

            foreach(IHelp cmd in Commands)
            {
                Console.WriteLine(cmd.HelpText);
            }

            Console.ReadKey();
        }

        void Compose()
        {
            var provider = new ConfigurableDefinitionProvider("mef.configuration");
            var catalog = new DefinitionProviderPartCatalog<ConfigurableDefinitionProvider>(provider);
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
 }
}

TestCommand.cs

namespace MEFTest
{
    //[Export("command", typeof(IHelp))]
    public class TestCommand : IHelp
    {
        private string _helpText = "This is a test.";

        public string CommandName
        {
            get { return "Test"; }
        }

        public string HelpText
        {
            get { return _helpText; }
        }
    }
}

App.Config部分:

<mef.configuration>
 <parts>
  <part type="MEFTest.TestCommand, MEFTest">
   <exports>
    <export contract="IHelp" />
   </exports>
  </part>
  <part type="MEFTest.Program, MEFTest">
   <imports>
    <import member="Commands" contract="IHelp" />
   </imports>
  </part>
 </parts>
</mef.configuration>

我没有遇到任何构建错误,如果我切换到属于MEF核心的典型基于属性的系统(也有适当的目录),它运行正常。在上面的示例中,Program.Commands始终为NULL。我试图使用单数属性而不是集合,并获得相同的结果。

当我调试时,我可以获得provider.Parts集合,所以我知道它正确访问配置信息;但是,每当我调试并尝试深入到catalog.Parts时,我都会收到InvalidOperationException。

任何人对我在哪里出错都有经验吗?

2 个答案:

答案 0 :(得分:0)

如记录here所示,您还需要在配置文件中使用此功能:

<configSections>
  <section
    name="mef.configuration"
    type="MefContrib.Models.Provider.Definitions.Configurable.PartCatalogConfigurationSection, MefContrib.Models.Provider" />
</configSections>

如果您已经拥有它,那么向我们展示访问InvalidOperationException时获得的provider.Parts的堆栈跟踪可能会很有趣。

答案 1 :(得分:0)

我遇到了同样的问题,无法让它工作,但这里有一些细节: 似乎ComposeParts()没有按预期工作(至少在我使用的版本中),因为它使用基于Reflection的静态方法来查找所有必需的Imports(因此看起来这部分不能从MEF外部更改)。不幸的是我们想要使用xml配置而不是MEF属性。

如果您将[Import]属性添加到与ComposeParts()一起使用的类的成员中,它将起作用。在你的情况下,这将是“程序”。在这种情况下,将找到配置文件中定义的所有导出。

我在MEF Contrib页面上找不到与该问题相关的任何文档或示例。此外,MEF contrib projekt中没有使用ComposeParts()的单元测试。 解决方法是使用container.GetExportedValues()来检索值,但在这种情况下,您必须手动设置类成员。

希望有所帮助。

相关问题