我一直在尝试使用可配置的提供程序模型来处理我从 MEF Contrib (链接) 的 MEF 导入和导出。我已阅读 Codeplex 文档和 Code Junkie 的博客文章(链接);但是,我似乎无法让容器来创建零件。我哪里错了?
程序.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);
}
}
}
测试命令.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。
有人对我在这里出错的地方有任何经验吗?