MEF: метаданные, кажется, переопределяют интерфейс при использовании GetExports - PullRequest
1 голос
/ 09 июня 2011

Я создаю основанное на плагине MEF WPF-приложение и столкнулся с проблемой с GetExports, возможно, это просто мое невежество, но я нахожу странное поведение. У меня есть несколько экспортированных частей, все они получены из 2 разных интерфейсов (назовем их A и B), но все они помечены одним и тем же атрибутом метаданных X. Поэтому у меня есть код вроде:

[Экспорт (TypeOf (А))] [TheXAttributeHere ...] открытый класс SomePart1: A {...}

для каждой части и то же самое для классов, реализующих B:

[Экспорт (TypeOf (В))] [TheXAttributeHere ...] открытый класс SomePart2: B {...}

Теперь, когда я пытаюсь получить все части, реализующие A и , декорированные атрибутом X с некоторыми значениями, MEF возвращает не только части, реализующие A, но ТАКЖЕ части, реализующие B. Поэтому, когда я ожидаю иметь дело с A-объектами, я получаю B, откуда исключение приведения.

В реальном мире интерфейсы называются IItemPartEditorViewModel и IItemPartEditorView, а их общий атрибут называется ItemPartEditorAttribute и предоставляет строковое свойство PartType, для которого я выполняю некоторую фильтрацию. Таким образом, мой код для получения деталей похож на пример ::1013*

<code>var p = (from l in container.GetExports<IItemPartEditorViewModel, IItemPartEditorMetadata>()
 where l.Metadata.PartType == sPartType
 select l).FirstOrDefault();

При поиске IItemPartEditorViewModel, чей PartType равен некоторому значению, я получаю IItemPartEditorView вместо реализующего объекта IItemPartEditorViewModel. Если вместо этого я закомментирую атрибут в объекте IItemPartEditorView, я правильно получу реализующий объект IItemPartEditorViewModel.

Обновление был использован предложенный "шаблонный" метод, но я здесь набрал его неправильно, поскольку забыл изменить на меньшее и большее, чем на сущности. Во всяком случае, просматривая код, я заметил, что в атрибуте у меня вместо этого был «ViewModel» или «View» для типа интерфейса, так что это была проблема. Позор мне, извините за беспокойство:)!

1 Ответ

1 голос
/ 09 июня 2011

Я думаю, что мне нужно увидеть больше кода, чтобы точно знать, что происходит. Однако я бы посоветовал вам позвонить в GetExports так:

// Get exports of type A
container.GetExports<A>();

// Get exports of type B
container.GetExports<B>();

Затем выполните фильтрацию по возвращаемому списку. Это, вероятно, исправит проблемы с актерами. Мне также было бы интересно увидеть код для настраиваемого атрибута метаданных. Например, если он получен из ExportAttribute, это может быть частью проблемы.

...