我一直在尝试使用可配置的提供程序模型来处理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。
任何人对我在哪里出错都有经验吗?
答案 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()来检索值,但在这种情况下,您必须手动设置类成员。
希望有所帮助。