Я пытался использовать настраиваемую модель поставщика для обработки импорта и экспорта MEF из MEF Contrib (ссылка). Я прочитал документацию 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);
}
}
}
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.
У кого-нибудь есть опыт относительно того, где я ошибаюсь здесь?