Вопрос или проблема
Наша команда недавно обновилась до VS MEF. Наши системные тесты зависят от атрибута ExportMetadata
для фильтрации ComposiblePartDefinitions
.
Я знаю, что у VS MEF есть следующее утверждение: Каждая MEF-часть должна использовать один вид атрибутов MEF. Смешивание атрибута экспорта MEF .NET с атрибутом экспорта метаданных MEF NuGet приведет к MEF-части, которая экспортируется без метаданных экспорта, поскольку каждый модуль обнаружения частей создает дескрипторы частей на основе атрибутов MEF, которые он предназначен понимать.
Но я не смешиваю атрибуты. Сможет ли кто-то использовать метаданные с VS MEF?
Вот как задаются атрибуты
[Export(typeof(IElectricCalculationOptions))]
[ExportMetadata("ExcludeFromSystemTests", "Не экспортировать это при использовании системных тестов, так как это требует авторизованного пользователя.")]
Когда я пытаюсь отфильтровать части или подсчитать их, я не нахожу ни одной с метаданными.
var count3 = requiredParts.Parts.Count(p => p.Metadata.Count > 0);
var filteredParts = requiredParts.Parts.Where(p => !p.Metadata.Keys.Contains("ExcludeFromSystemTests"));
Ответ или решение
Проблема, с которой вы столкнулись, связана с использованием атрибутов экспорта и метаданных в контексте Visual Studio MEF (Managed Extensibility Framework). Вы правильно указали, что смешивание атрибутов из различных версий MEF может привести к тому, что метаданные не будут правильно применены. Однако, если вы не смешиваете атрибуты, но все равно сталкиваетесь с отсутствием метаданных при фильтрации, возможно, проблема заключается в чем-то другом.
Вот несколько шагов, которые могут помочь вам решить эту проблему:
-
Проверьте правильность настройки атрибутов: Убедитесь, что вы используете правильные пространства имен для атрибутов
Export
иExportMetadata
. Например:using System.ComponentModel.Composition;
Это важно, так как использование неверного пространства имен может привести к неправильному поведению.
-
Проверьте конфигурацию контейнера: Убедитесь, что ваш контейнер MEF настроен правильно и что части правильно загружаются. Например:
var catalog = new AggregateCatalog(); catalog.Catalogs.Add(new AssemblyCatalog(typeof(YourExportedClass).Assembly)); var container = new CompositionContainer(catalog); // Настройте контейнер для получения необходимых частей var requiredParts = container.GetExports<IElectricCalculationOptions, IDictionary<string,object>>();
-
Проверьте наличие метаданных: Убедитесь, что фактически есть часть, которая экспортирует метаданные. Попробуйте вывести список всех экспортированных частей вместе с их метаданными для диагностики:
foreach (var part in requiredParts) { Console.WriteLine($"Part: {part.Value}, Metadata: {string.Join(", ", part.Metadata.Keys)}"); }
-
Обратите внимание на правильность фильтрации: Убедитесь, что вы правильно фильтруете части. Используйте отладку, чтобы проверить, какие ключи метаданных действительно присутствуют для каждой части:
var count3 = requiredParts.Count(p => p.Metadata.Count > 0); var filteredParts = requiredParts.Where(p => !p.Metadata.ContainsKey("ExcludeFromSystemTests"));
-
Тестирование: Напишите отдельные тесты, чтобы проверить, добавляются ли метаданные правильно. Иногда полезно изолировать проблему в тестовой среде, чтобы понять, в чем может быть ошибка.
Если после выполнения всех этих шагов проблема все еще остается, вы можете обратиться к документации Visual Studio MEF и, возможно, к сообществу, чтобы узнать, сталкивались ли другие разработчики с подобными проблемами. Не забывайте также проверить возможности обновления библиотеки MEF, если вы используете устаревшую версию.