Как определить детали в MEF? - PullRequest
2 голосов
/ 03 декабря 2011

Вопрос так прост: мне нужен какой-то способ определения составных определений деталей перед тем, как создавать детали.

Другими словами, мне нужно иметь возможность отправить строку, идентифицирующую деталь, на некоторый удаленный сайт, который позже отправит мне эту строку, и я смогу выбрать эту же часть на основе этой строки. Мне не обязательно нужна строка (я могу построить свою собственную карту), но мне нужно что-то уникальное и сопоставимое с равенством.

Некоторые вещи, о которых я думал и отвергал:

  1. Я понимаю, что «правильный» способ сделать это - украсить мои части метаданными, но я не хочу. Во-первых, использование значимой строки для идентификатора означает риск дублирования, а использование случайной (например, GUID) означает, что это будет некрасиво. Во-вторых, у меня много плагинов, и я не хочу постоянно помнить о том, чтобы их украшать.
  2. Другой способ, который сразу приходит на ум, - это использовать тип детали. Однако MEF достаточно универсален, чтобы быть выше таких формальностей: часть не обязательно является классом .NET.
  3. Пытаясь «исправить» предыдущую точку, я мог бы использовать тип фактического объекта, который возвращается, когда я иду и создаю деталь, но тогда мне придется создавать все детали, которых много.

1 Ответ

0 голосов
/ 04 декабря 2011

Метаданные - действительно единственно возможный вариант, особенно если вы хотите, чтобы идентификатор оставался стабильным в течение долгого времени, например, при перезапуске приложения или реализации класса рефакторинг / переименование.

Если вам не нужна стабильность между перезапусками приложения, вы можете:

  • Используйте MEF 2 RegistrationBuilder для программного генерирования необходимых значений метаданных, например, на основе возрастающего целого числа; или
  • Создайте пользовательский [MetadataAttribute], который делает примерно то же самое для генерации значения идентификатора во время выполнения

Если вам нужна стабильность между перезапусками, но не между перестроениями, тогда можно использовать RegistrationBuilder для назначения идентификаторов на основе имени типа.

Конечно, RegistrationBuilder доступен только в предварительных сборках CodePlex MEF 2 или .NET 4.5 Developer Preview на данный момент.

TLDR; Лучше всего вручную применять атрибуты метаданных. В режиме отладки вы можете написать подпрограмму после инициализации в своем приложении, чтобы обеспечить уникальность / присутствие.

...