Модель поставщика MEF Contrib не импортирует детали - PullRequest
2 голосов
/ 09 января 2010

Я пытался использовать настраиваемую модель провайдера для обработки моего импорта и экспорта MEF из MEF Contrib ( ссылка ). Я прочитал документацию Codeplex и пост в блоге Code Junkie ( ссылка ); Тем не менее, я не могу получить контейнер для создания частей. Куда я иду не так?

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 каждый раз, когда отлаживаю и пытаюсь углубиться в каталог. Детали.

У кого-нибудь есть опыт относительно того, где я иду не так?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

У меня были те же проблемы, и я не мог заставить его работать, но вот некоторые детали: Кажется, что ComposeParts () не работает должным образом (по крайней мере, в версии, которую я использовал), потому что он использует статические методы, основанныеОтражение, чтобы найти все необходимые импорты (так что кажется, что эта часть не может быть изменена за пределами MEF).К сожалению, мы хотим использовать конфигурацию xml, а не атрибуты MEF.

Это работает, если вы добавляете атрибуты [Import] к членам класса, который вы используете с ComposeParts ().В вашем случае это будет «Программа».В этом случае будут найдены все экспорты, определенные в файле конфигурации.

Я не смог найти никакой документации или примеров на странице MEF Contrib, касающейся этой проблемы.Кроме того, в проекте MEF contrib нет юнит-теста, использующего ComposeParts ().Обходной путь может заключаться в использовании container.GetExportedValues ​​() для получения значений, но в этом случае вы должны установить члены классов вручную.

Надеюсь, это поможет.

0 голосов
/ 11 января 2010

Как указано здесь , вам также нужно это в вашем конфигурационном файле:

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

Если у вас это уже есть, было бы интересно показать нам трассировку стека InvalidOperationException, полученную при доступе к provider.Parts.

...