MEF: «Композиционная деталь должна содержать хотя бы один ЭКСПОРТ» - PullRequest
1 голос
/ 13 июля 2011

Из официальной документации MEF :

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

Означает ли это, что этот фрагмент из той же документации не будет работать при использовании каталогов по умолчанию, поскольку он не экспорт ничего?

class Program
{
  [Import]
  public IMessageSender MessageSender { get; set; }
}

Мне трудно поверить, что все классы, участвующие в MEF mix , должны все «приносить еду на стол», даже если они просто хотят «потреблять».
Приведенный выше Program является простым примером: нет ничего, что этот класс мог бы добавить к смеси MEF .

Во-вторых,
Как детали добавляются "явно в контейнер" ?
Документация, например, CompositionContainer больше мне не помогает.

Спасибо заранее Jan

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

A составная деталь - это деталь, которую можно импортировать в другую деталь. Пример здесь:

class Program
{
    [Import]
    public IMessageSender MessageSender { get; set; }
}

Program не является составной частью. Это само по себе не импортируется автоматически в другую часть. Ваши экспортные данные для IMessageSender являются составными частями.

Вы можете добавить детали деталей в контейнер, используя CompositionBatch, что позволяет вам явно добавлять экземпляры Export и ComposablePart в ваш контейнер, или через расширение вы можете добавлять необработанные значения:

var user = new User() { Name = "Matt" };
var batch = new CompositionBatch();
batch.AddExportedValue(user);

CompositionContainer.Compose(batch);

Где последний вызов добавляет ваши части в контейнер.

0 голосов
/ 14 июля 2011

в вашем примере, программа должна будет вызвать container.SatisfyImports();, чтобы получить IMessageSender.

Кроме того, вы можете использовать унаследованный экспорт в интерфейсе, так что все, что реализует указанный интерфейсавтоматически экспортируется.

[InheritedExport]
public interface IMessageSender
{
}

См. мой код здесь: MEFMVVMCS.zip

...