Это не то же самое;)
[Import]
означает, что вы хотите импортировать одну вещь в соответствии с контрактом.В MEF контракт - это просто строка, и когда вы импортируете тип (например, IEnumerable<IBar>
), вы действительно импортируете в соответствии с контрактом, который является просто name этого типа.
В MEF кардинальность очень важна, поэтому, когда вы заявляете, что хотите импортировать единственный экземпляр чего-то, что соответствует указанному контракту, может быть только один источник.Если найдено несколько экспортов, возникает исключение из-за несоответствия количества элементов.
Функциональность [Import]
не содержит специальной логики для обработки IEnumerable<T>
, поэтому с ее точки зрения это просто контракткак и все остальное.
Атрибут [ImportMany]
, тем не менее, существует специально для преодоления этого разрыва.Он принимает ноль к любому количеству экспорта по указанному контракту.Это означает, что вместо одного экспорта IEnumerable<IBar>
вы можете иметь много экспортов IBar
, разбросанных по нескольким сборкам, и никогда не будет несоответствия количества элементов.
В конце концов, это философия дизайна.MEF мог иметь специальные встроенные знания о IEnumerable<T>
.Autofac (и, по-видимому, Ninject) делает это и называет это типом отношения .
Однако подобный специальный регистр подразумевает, что где-то код реализации нарушает принцип замены Лискова , что снова может привести к нарушениям POLA , поэтому в этом случае я склонен принять сторону конструкторов MEF.Переход к более явному API может снизить вероятность обнаружения, но может быть немного безопаснее.