【问题标题】:MEF Contrib Provider Model Not Importing PartsMEF Contrib Provider 模型不导入部件
【发布时间】:2010-01-09 19:05:08
【问题描述】:

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

程序.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。

有人知道我在哪里出错了吗?

【问题讨论】:

    标签: mef provider


    【解决方案1】:

    正如 here 所记录的,您的配置文件中也需要这个:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-08-24
        • 1970-01-01
        • 2011-05-19
        • 2011-07-25
        • 2015-10-18
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多