Импорт детали с определенными метаданными с помощью MEF Preview 5

У меня есть экспорт, определенный следующим образом в предварительном просмотре MEF 5.

[ExportMetadata("Application", "CheckFolderApplication")]
[Export(typeof(ExtendedArtifactBase))]
public class CheckFolderArtifact2 : ExtendedArtifactBase
{ ...

Затем мне нужны только импорты с метаданными "Application" "CheckFolderApplication". Для этого я читаю все импорты и затем фильтрую результат.

[Import(typeof(ExtendedApplicationBase))]
private ExportCollection<IApplication> _applications { get; set; }

public IApplication GetApplication(string applicationName)
{
    return _applications.Single(a => a.GetExportedObject().Name == applicationName).GetExportedObject();
 }

Это кажется действительно неэффективным. Что, если у меня есть тысячи подключаемых модулей — нужно ли мне читать их все через MEF, чтобы получить один с правильными метаданными? Если да, то как вы кешируете результат?


c# mef
person Riri    schedule 19.05.2009    source источник


Ответы (2)


Да, в этом случае вам придется заниматься фильтрацией самостоятельно.

Чтобы кешировать результат, вы можете просто сохранить его в другой приватной переменной. Если вы хотите поддерживать рекомпозицию (вам нужно установить для свойства AllowRecomposition атрибута импорта значение true), вы можете реализовать IPartImportsSatisfiedNotification в своем классе, и метод интерфейса OnImportsSatisfied будет вызываться всякий раз, когда импорт был установлен.

person Daniel Plaisted    schedule 19.05.2009
comment
Спасибо, Даниэль, это веб-приложение ASP.NET MVC, поэтому мне нужно найти другой способ его кэширования... - person Riri; 20.05.2009
comment
Эта ситуация вообще изменилась в .Net 4.0 или она осталась прежней? - person Tim Lovell-Smith; 27.04.2010
comment
@Tim В .Net 4 все то же самое. - person Daniel Plaisted; 28.04.2010

Я обнаружил, что хочу сделать что-то подобное. В конце концов я импортировал Lazy и фильтрацию метаданных, как, надеюсь, способ избежать создания реальных объектов раньше времени.

[ImportMany(typeof(MyInterface))]
List<Lazy<MyInterface,MyMetadataType>> MyGuys { get; set; }

(И со строго типизированными метаданными - я также использовал функцию, в которой вы можете создать интерфейс MyMetadataType с получением только для чтения и передать его вместо установки TMetadata = IDictionary)

Я предполагаю, что MEF все еще должен прочитать, по крайней мере, метаданные всех «тысяч плагинов», хотя ...

person Tim Lovell-Smith    schedule 28.04.2010