Импорт многих экземпляров с использованием MEF

Я экспортирую некоторые классы, реализующие интерфейс IFoo, подобный этому

public interface IFoo { }

[Export("A", typeof(IFoo))]
public class Foo1 : IFoo { }

[Export("B", typeof(IFoo))]
public class Foo2 : IFoo { }

Когда я пытаюсь импортировать один из них, используя

 containter.GetExportedValue<IFoo>("A"); 

это работает хорошо, но когда я пытаюсь импортировать их все так

[ImportMany]
IFoo[] foos;

это не работает.

Может ли кто-нибудь сказать мне, как это решить?


person Michelle    schedule 09.03.2012    source источник
comment
Вопрос - не должен ли foos быть свойством с get; набор; ?   -  person labroo    schedule 09.03.2012


Ответы (2)


Чтобы иметь оба варианта, объявите 2 экспорта:

public interface IFoo { }

[Export(typeof(IFoo))]
[Export("A", typeof(IFoo))]
public class Foo1 : IFoo { }

[Export(typeof(IFoo))]
[Export("B", typeof(IFoo))]
public class Foo2 : IFoo { }

Тогда это должно работать (я сделал тестовый образец и заставил его работать).

ХТХ,

Баб.

person Louis Kottmann    schedule 09.03.2012
comment
Привет @Baboon, я думал, что использование [Export (string, Type)] позволяет экспортировать оба одновременно. - person Michelle; 09.03.2012
comment
Это прекрасно работает. Кроме того, если вы опускаете имя в одном из экспортов, оно становится значением по умолчанию, что действительно полезно для обхода определенных типов циклических зависимостей. - person Contango; 21.10.2013
comment
есть ли способ сделать [ImportMany] и по-прежнему получать имена контрактов? - person Stijn Tallon; 01.06.2015

Удалите имена контрактов в вашем экспорте.

[Export("A", typeof(IFoo))]

To

[Export(typeof(IFoo))]

В первом сценарии вы экспортируете контракт, соответствующий имени «A» и типу IFoo, в то время как во многих случаях импорта вы импортируете все, что соответствует контракту типа IFoo (без имени контракта), поэтому экспорт с именами контрактов не не считается.

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

person Gilles    schedule 09.03.2012
comment
Да, но тогда он больше не сможет импортировать только A. - person Louis Kottmann; 09.03.2012
comment
@Baboon: Интересно, можно ли в этом случае экспортировать часть с контрактом и без него, чтобы использовать оба типа импорта. Но не знаю, нужно ли это в данном случае. - person Gilles; 09.03.2012
comment
Привет @Gilles, Бабуин прав, мне нужно использовать оба способа для их импорта. - person Michelle; 09.03.2012