У меня проблема с экспортом 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");