GetExports <type>не возвращает товары с contractName - PullRequest
2 голосов
/ 20 июля 2011

У меня проблема с экспортом MEF.

У меня есть семейство объекта, которое реализует один интерфейс. Все они публикуются с пользовательским атрибутом публикации. Атрибут требует строку, которая передается как ContractName . Кроме того, атрибут устанавливает ContractType в качестве одного общего интерфейса.

Мой класс атрибутов выглядит так:

public class ItemCreatorAttribute : ExportAttribute, IItemCreatorMetadata
{
    public ItemCreatorAttribute(String type)
        : base(type, typeof(IItemCreator)){..}

Все работает хорошо, если я хочу импортировать только один объект, и я использую как имя контракта, так и тип. Однако мои попытки получить список объектов только по типу (IItemCreator в данном случае) не увенчались успехом.

Я пытался получить элементы, используя атрибуты Container.GetExports и ImportMany, оба метода не дают результатов.

Есть идеи?

С уважением Шимон

Редактировать

Я решил проблему, перебирая части каталога, но все еще ищу лучшее решение.

var exportsCollection = new List<ExportDefinition>();
foreach (var export in Container.Catalog.Parts)
{
    foreach (var exportDef in export.ExportDefinitions)
    {
        if (exportDef.Metadata.ContainsKey("ExportTypeIdentity"))
            if (contractType.Equals(exportDef.Metadata["ExportTypeIdentity"]))
                exportsCollection.Add(exportDef);
    }
}

Редактировать 2

aL3891 Я думал так же, но я сделал тест, когда я пытаюсь получить список только с типом контракта, а затем с типом контракта и именем. Я ожидал, что только тип контракта вернет все доступные элементы. Однако, похоже, он имеет значение null и ищет элементы типа с пустым именем контракта.

// No results
var test = Container.GetExports<IItemCreator>();
// 1 Result
var test2 = Container.GetExports<IItemCreator>("Foo");

1 Ответ

1 голос
/ 20 июля 2011

Имеется ли у экспортируемых вами товаров какой-либо собственный импорт? если это так, и mef не может удовлетворить этот импорт, они не будут отображаться в составе.

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

Меф называет это Стабильная композиция

...