Есть ли что-то вроде exportmany в mef? - PullRequest
0 голосов
/ 13 июня 2018

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

public static IEnumerable<IFileMetaDataProvider> _providers;
    [ExportMany(typeof(IFileMetaDataProvider))] 
    public static IEnumerable<IFileMetaDataProvider> Providers {
        get {
            if (_providers == null) {
                _providers = new IFileMetaDataProvider[2];
            }
            return _providers;
        }
    }

Экземпляры, которые будут экспортированы, будут определены во время выполнения, и я не хочу кодировать для каждого отдельного экземпляра (Потому что экземпляры могут принимать зависимости от других экспортированных экземпляров, типизированных интерфейсом :(), кто-нибудь может сказать мне, как я могу добиться этого с помощью комментариев или программирования?

1 Ответ

0 голосов
/ 13 июня 2018

У вас отношения между импортом и экспортом инвертированы.Вы хотите, чтобы любой класс, который реализует IFileMetaDataProvider , также Экспортирует этот интерфейс.

Ваш код, который использует эти реализации, будет выглядеть так

[ImportMany(typeof(IFileMetaDataProvider))] 
public static IEnumerable<IFileMetaDataProvider> Providers

Атрибут Import вызовет исключение, если несколько компонентов экспортируют одно и то же значение. ImportMany импортирует один или несколько компонентов, которые имеют соответствующий атрибут Export .

Если классы, которые реализуют IFileMetaDataProvider , также имеют ImportАтрибуты или ImportMany , эти импорты также будут удовлетворяться MEF во время компоновки.Пока в каталоге есть соответствующие экспорты, вам не нужно беспокоиться о зависимостях для ваших импортированных компонентов.

...