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

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

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

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

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

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


person tanascius    schedule 16.06.2009    source источник


Ответы (3)


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

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

person Daniel Plaisted    schedule 16.06.2009

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

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

person Wes Haggard    schedule 20.06.2009
comment
есть ли способ сделать это с помощью атрибутов? I.E. [InheritedExport] открытый класс Cat: Атрибут {} [Cat] открытый класс Ruth {} ......... [ImportMany (Cat)] IEnumerable ‹Cat› коты; // коты будут содержать Рут - person Mike; 22.04.2010

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

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

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

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

[ImportingConstructor]
public void MyClass([ImportMany] IEnumerable<IMyInterface> myDerivedObjects)
person Lee Oades    schedule 23.01.2014