Как импортировать несколько плагинов / частей, используя MEF? - PullRequest
2 голосов
/ 18 сентября 2009

Я новичок в MEF и пытаюсь использовать его для создания подключаемой системы, но застрял на первом этапе.

Я следую за статьей Эндрю Уайтчепела . Я скачал его пример кода, и он работает нормально (если вы удалите одну из «экспортирующих» сборок - они взаимоисключающие в его примере - и ссылаетесь на сборку MEF).

Пример иллюстрирует импорт отдельной детали. Я хочу импортировать несколько частей (все на основе одного интерфейса). Итак, я изменяю пример кода следующим образом:

[Import]
// OLD - public Interface.ICalculate Calculate { get; set; }
public IEnumerable<Interface.ICalculate> Calculators { get; set; }

// OLD - Console.WriteLine(
// OLD -     String.Format("{0}", Calculate.Circumference(4)));
foreach (Interface.ICalculate calculator in Calculators)
{
    Console.WriteLine(
    String.Format("{0}", calculator.Circumference(4)));
}

Я также импортировал System.Collections.Generic для IEnumerable.

Смена ключа - первая. Насколько я понимаю, это позволит мне импортировать детали из нескольких сборок. Однако я получаю следующую ошибку:

No valid exports were found that match the constraint

На данный момент я даже не добавил несколько «плагиновых» сборок. Все еще только один.

Для полноты вот его определение экспорта (которое я не коснулся) в библиотеке классов «плагина»:

[Export(typeof(Interface.ICalculate))]
public class Calculate : Interface.ICalculate

Есть идеи? Я чешу голову здесь. Я искал SO и форумы MEF, но мог найти что-нибудь, чтобы просветить меня.

Я использую VS 2008 SP1 (бета-версия 2010 не установлена) и последнюю сборку System.ComponentModel.Composition (2009.26.8.0).

1 Ответ

5 голосов
/ 18 сентября 2009

MEF Preview Release 5 изменил это. Теперь вам нужно использовать ImportManyAttribute вместо ImportAttribute:

[ImportMany]
public IEnumerable<Intertface.ICalculate> Calculators { get; set; }

Подробнее см. Объявление для PR5 .

.
...