我一直在努力使用可配置提供程序模型来处理我的MEF进口和出口从MEF的Contrib(的链接)。我读过的Codeplex上的文档和代码吸毒者的博客文章(的链接);不过,我似乎无法得到容器中创建的零件。我在哪里去了?

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集合,所以我知道它的正确访问配置信息;不过,我得到每当我调试一个InvalidOperationException并尝试钻入catalog.Parts。

任何人有任何经验,我要去错在这里哪里?

有帮助吗?

解决方案

如记录这里,还需要这在你的配置文件:

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

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

其他提示

我有同样的问题,不能得到它的工作,但这里有一些细节: 看来,ComposeParts()不能按预期工作(至少在我使用的版本),因为它使用静态方法,基于反射找到所有需要的进口(这样看来,这部分不能从MEF以外的改变)。不幸的是,我们要使用XML配置,而不是MEF属性。

如果添加[导入]属性的类的你与你使用ComposeParts成员(它的工作原理)。在你的情况,这将是“PROGRAMM”。在这种情况下在配置文件中定义的所有出口将被发现。

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

希望有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top