Как мне требовать, чтобы при использовании атрибута ImportMany была импортирована хотя бы одна деталь? - PullRequest
2 голосов
/ 23 сентября 2011

По умолчанию ImportAttribute требует, чтобы ровно одна часть удовлетворяла договору, указанному в атрибуте.Это поведение можно изменить с помощью свойства ImportAttribute.AllowDefault.По сути, это меняет поведение, позволяя нулю или одной части удовлетворить контракт.Если нет частей, вместо этого используется значение по умолчанию для этого импорта.

ImportManyAttribute позволяет ноль или более частей удовлетворить контракт.MEF будет удовлетворять этот импорт, используя пустую коллекцию, или одноэлементную коллекцию, или набор частей в зависимости от того, что он находит.

Как мне сказать MEF, что пустая коллекция недействительна?

Должен ли я:

  1. Реализовать IPartImportsSatisfiedNotification и выдать исключение из OnImportsSatisfied, если коллекция пуста?
  2. Реализовать мою собственную ImportOneOrMoreAttribute?
  3. Использовать некоторые встроенные функции MEF, которые мне как-то не хватает?

1 Ответ

4 голосов
/ 23 сентября 2011

MEF понимает только три кардинальности по умолчанию: ZeroOrOne, ExactlyOne или ZeroOrMore.См. ImportCardinality .Таким образом, вы не можете выразить это самостоятельно в рамках ограничений атрибутов MEF.Я бы не предлагал выдавать исключения в OnImportsSatisfied, потому что вы, скорее всего, столкнетесь с другими непредсказуемыми проблемами.

Боюсь, лучшее, что вы можете сделать, - это ImportMany и проверить это в контексте того, когда вы будете использовать этот импорт.

...