Отсутствующие метаданные в VS MEF

Вопрос или проблема

Наша команда недавно обновилась до 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 может привести к тому, что метаданные не будут правильно применены. Однако, если вы не смешиваете атрибуты, но все равно сталкиваетесь с отсутствием метаданных при фильтрации, возможно, проблема заключается в чем-то другом.

Вот несколько шагов, которые могут помочь вам решить эту проблему:

  1. Проверьте правильность настройки атрибутов: Убедитесь, что вы используете правильные пространства имен для атрибутов Export и ExportMetadata. Например:

    using System.ComponentModel.Composition;

    Это важно, так как использование неверного пространства имен может привести к неправильному поведению.

  2. Проверьте конфигурацию контейнера: Убедитесь, что ваш контейнер 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>>();
  3. Проверьте наличие метаданных: Убедитесь, что фактически есть часть, которая экспортирует метаданные. Попробуйте вывести список всех экспортированных частей вместе с их метаданными для диагностики:

    foreach (var part in requiredParts)
    {
       Console.WriteLine($"Part: {part.Value}, Metadata: {string.Join(", ", part.Metadata.Keys)}");
    }
  4. Обратите внимание на правильность фильтрации: Убедитесь, что вы правильно фильтруете части. Используйте отладку, чтобы проверить, какие ключи метаданных действительно присутствуют для каждой части:

    var count3 = requiredParts.Count(p => p.Metadata.Count > 0);
    var filteredParts = requiredParts.Where(p => !p.Metadata.ContainsKey("ExcludeFromSystemTests"));
  5. Тестирование: Напишите отдельные тесты, чтобы проверить, добавляются ли метаданные правильно. Иногда полезно изолировать проблему в тестовой среде, чтобы понять, в чем может быть ошибка.

Если после выполнения всех этих шагов проблема все еще остается, вы можете обратиться к документации Visual Studio MEF и, возможно, к сообществу, чтобы узнать, сталкивались ли другие разработчики с подобными проблемами. Не забывайте также проверить возможности обновления библиотеки MEF, если вы используете устаревшую версию.

Оцените материал
Добавить комментарий

Капча загружается...