使用MEF中的通用接口

本文关键字:接口 MEF 使用 | 更新日期: 2023-09-27 18:25:22

我正在开发一个启用了MEF的应用程序。有一个核心库项目可以作为粘合剂并实现:

 CompositionContainer cc = new CompositionContainer(catalog);
 cc.ComposeParts(this);

我已经在这个核心库中声明了所有[导入]零件,如下所示:

 [Import(typeof(IHost))]
        // The imported host form
        public IHost Host
        { get; set; }
   [Import(typeof(ILightStudents<?>))]
   public ILightStudents<?> StudentsAPI  { get; set; }

在其他具有[export]属性的库项目中实现IHost或其他接口时存在一些问题,但这里的问题是我声明了ILightStudents如下:

public interface ILightStudents<T> where T:class
    {
        IEnumerable<T> Students();
        T GetStudent(long id);
    }

但正如您在以前的代码中看到的,我输入了"?"在进口部件中标记。正如您所知,泛型方法的目的是您可以通过所需的任何类或类型来实现它们。在这里,我想用我合适的类型在其他库项目中实现ILightStudents,但我不能在不指定类型的情况下离开[import]部分。

你能帮我吗?

编辑

我几乎可以通过使用动态类型绑定来解决这个问题。

使用MEF中的通用接口

几天前我从另一个线程复制了答案:

尝试

[Export(typeof(IService<>))]

要从typeof运算符获得泛型类型定义,可以省略类型参数。对于具有多个类型参数的类型,请使用逗号表示该类型的"arity"。例如:

typeof(List<>)              // not: typeof(List<T>)
typeof(IDictionary<,>)      // not: typeof(IDictionary<K, V>)

使用其中之一:

  • MefContrib或
  • MEF 2预览

这项功能在两者中都添加了,它将包含在.NET 4.5中。