MEF: интерфейс Mark для экспорта

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

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

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

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

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

.net,mef,

4

Ответов: 3


4 принят

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

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


3

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

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


2

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

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

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

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

[ImportingConstructor]
public void MyClass([ImportMany] IEnumerable<IMyInterface> myDerivedObjects)
.net, MEF,
Похожие вопросы