Импортировать деталь с определенными метаданными, используя MEF Preview 5 - PullRequest
3 голосов
/ 19 мая 2009

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

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

Тогда я только хочу импортировать эти данные с метаданными "Приложение" "CheckFolderApplication". Чтобы сделать это сейчас, я прочитал all import и затем отфильтровал результат.

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

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

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2009

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

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

0 голосов
/ 29 апреля 2010

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

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

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

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

...