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

MEF Contrib提供程序模型不导入零件

  •  2
  • JamesEggers  · 技术社区  · 16 年前

    我一直在尝试使用可配置的提供者模型来处理从MEF Contrib导入和导出的MEF( link ). 我已经阅读了Codeplex文档和Code Junkie的博客文章( link

    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);
            }
     }
    }
    

    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 回复  |  直到 16 年前
        1
  •  0
  •   Wim Coenen    16 年前

    有案可查 here

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

    如果您已经有了,那么向我们展示 InvalidOperationException 当你访问 provider.Parts .

        2
  •  0
  •   Bernhard Kircher    16 年前

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

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

    我在MEF Contrib页面上找不到与该问题相关的任何文档或示例。此外,MEF contrib项目中没有使用ComposeParts()的单元测试。

    希望有帮助。

    推荐文章