MEF: пометить интерфейс для экспорта - PullRequest
4 голосов
/ 16 июня 2009

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

[Export( typeof( IMyInterface ) )]
public interface IMyInterface { ... }

[Import( typeof( IMyInterface ) )]
private readonly ICollection<IMyInterface> m_Concretes = new Collection<IPlugin>();

Я не знаю, какие классы реализуют IMyInterface в этом примере. Сами классы ничего не знают о MEF - и не используют атрибут [Export].

Пока я не отмечаю каждый класс [Export], мне кажется, это не работает.

Ответы [ 3 ]

4 голосов
/ 16 июня 2009

В текущем предварительном просмотре вы можете попробовать добавить атрибут [PartExportsInherited] в интерфейс (вместе с атрибутом Export). Я не уверен, будет ли это работать для интерфейсов или нет.

Мы планируем добавить поддержку для экспорта в интерфейсы.

3 голосов
/ 20 июня 2009

Да, в текущем предварительном просмотре на codeplex вы можете пометить интерфейс как PartExportsInherited, так и Export, чтобы получить возможность автоматического экспорта всех исполнителей. В готовящемся предварительном выпуске мы, скорее всего, упростим это, чтобы просто разместить один атрибут, возможно, что-то вроде [InheritedExport].

Редактировать: теперь в MEF preview 6 это можно сделать, поместив атрибут InheritedExport в интерфейс.

2 голосов
/ 23 января 2014

Обновление: использование MEF v4.

[InheritedExport(typeof(IMyInterface))]
public interface IMyInterface
{
}

Как и ожидалось, все, что наследуется от IMyInterface, будет экспортировано как единое целое.

Используйте [ImportMany], чтобы ввести их все:

[ImportingConstructor]
public void MyClass([ImportMany] IEnumerable<IMyInterface> myDerivedObjects)
...