использование общих интерфейсов в MEF - PullRequest
2 голосов
/ 22 февраля 2012

Я занимаюсь разработкой приложения с поддержкой MEF. Существует базовый проект библиотеки, который работает как клей и реализует:

 CompositionContainer cc = new CompositionContainer(catalog);

 cc.ComposeParts(this);

Я объявил все части [Import] в этой базовой библиотеке, такие как ниже:

 [Import(typeof(IHost))]
        // The imported host form
        public IHost Host
        { get; set; }

   [Import(typeof(ILightStudents<?>))]
   public ILightStudents<?> StudentsAPI  { get; set; }

Существует такая проблема при реализации IHost или других интерфейсов в других проектах библиотеки, которая имеет атрибут [export], но проблема здесь в том, что я объявил ILightStudents следующим образом:

public interface ILightStudents<T> where T:class
    {
        IEnumerable<T> Students();

        T GetStudent(long id);

    }

Но, как вы видели в предыдущем коде, я поставил '?' отметка в импортной части. Как вы знаете, цель универсальных методов состоит в том, что вы можете реализовать их любым классом или типом, который вам нужен. И здесь я хочу реализовать ILightStudents в другом проекте библиотеки с моим правильным типом, но я не могу оставить часть [import] без указания типа.

Не могли бы вы помочь мне, пожалуйста?

Отредактировано

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Несколько дней назад я скопировал ответ из другой ветки:

Попробуйте

[Export(typeof(IService<>))]

Чтобы получить определение общего типа от оператора typeof, вы опускаете аргументы типа. Для типов с более чем одним параметром типа используйте запятые для обозначения «арности» типа. Например:

typeof(List<>)              // not: typeof(List<T>)
typeof(IDictionary<,>)      // not: typeof(IDictionary<K, V>)
2 голосов
/ 22 февраля 2012

Используйте либо:

  • код в MefContrib или
  • Предварительный просмотр MEF 2.

Эта функция была добавлена ​​в обе - она ​​будет включена в .NET 4.5.

...