Использование обобщений в MEF-контексте - PullRequest
0 голосов
/ 04 января 2019

Я хочу использовать дженерики в сочетании с MEF - "[ImportMany (....))]", но я получаю ошибки компиляции.

Следующий код без с использованием обобщений отлично работает : Фабричный класс "HelperOneFactory" (см. Ниже) выполняет поиск всех реализаций интерфейса "IHelperOne". Из этого списка берется первый без значения метаданных «Оригинал». Если он не существует, он берет первое без проверки значения метаданных.

/// =====================================================================================
/// factory-implementation for interface-type "IHelperOne"  (==> works fine)
/// =====================================================================================
[Export(typeof(HelperOneFactory))]
public class HelperOneFactory: IPartImportsSatisfiedNotification
{
    [ImportMany(typeof(IHelperOne))]
    private IEnumerable<Lazy<IHelperOne, Dictionary<string, object>>> Helper;

    /// <summary>
    /// reference to the relevant implementaion (HelperOneOriginal or HelperOneCusto)
    /// </summary>
    public IHelperOne Current { get; private set; }

    /// <summary>
    /// looking for all implementations of IHelperOne to find out the one to use
    /// </summary>
    public void OnImportsSatisfied()
    {
        Current = Helper.Count() > 1 ? Helper.First<Lazy<IHelperOne, Dictionary<string, object>>>(s => !s.Metadata.ContainsValue("Original")).Value :
            Helper.First<Lazy<IHelperOne, Dictionary<string, object>>>().Value;
    }

Это прекрасно работает, но я должен реализовать фабричные классы для многих типов интерфейсов. Поэтому я пытаюсь использовать generics для типа интерфейса , но затем я получаю ошибки компиляции (используя .NET Framework 4.6.1):

/// =====================================================================================
/// a version with using generic ==>  compiler-errors !!
/// =====================================================================================
[Export(typeof(HelperTemplateFactory<>))]
public class HelperTemplateFactory<THelperInterface> : IPartImportsSatisfiedNotification
{
    [ImportMany(typeof(THelperInterface))]            // ==> ERROR:       "Attribute argument cannot use type parameters"
    [ImportMany(THelperInterface)]                    // ==> also ERROR:  "Type parameter name is not valid at this point"
    private IEnumerable<Lazy<THelperInterface, Dictionary<string, object>>> Helper;

    ...

Можно ли использовать универсальный тип для команды "ImportMany"?

Контекст проблемы:

«Нормальный» класс «HelperOneOriginal» является стандартной версией HelperOne и может быть перезаписан в пользовательских проектах путем определения подкласса «HelperOneCustom», обычно размещаемого в отдельном VisualStudio-проекте. Оба класса имеют интерфейс «IHelperOne».

Основная программа должна использовать Custom-класс, если он определен, или иначе Original-класс. Оригинал-класс имеет метаданные-информацию "Оргинал". Поэтому HelperOneFactory ищет все реализации IHelperOne-интерфейсов и принимает первую без метаданных «Оригинал». Если он не существует, он принимает класс Original. Ссылка на соответствующий класс хранится внутри HelperClass в члене «Текущий» для использования основной программой.

При необходимости может быть предоставлен небольшой тестовый проект.

1 Ответ

0 голосов
/ 06 января 2019

Я предлагаю написать «ответ», чтобы отметить вопрос «решен» =>

a line with only    "[ImportMany]"   is the solution!

Благодаря Дэйву М

...