在MEF中使用通用接口

3

我正在开发一个使用了MEF技术的应用程序。其中有一个核心库项目作为粘合剂,实现了以下功能:

 CompositionContainer cc = new CompositionContainer(catalog);

 cc.ComposeParts(this);

我已经在这个核心库中声明了以下所有的[Import]部分:

我已经在这个核心库中声明了以下所有的[Import]部分:

 [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]部分没有指定类型。

请帮帮我好吗?

编辑:

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


我能想到唯一可能的<?>来源就是包含StudentsAPI属性的类上的类型参数。由于这个类不是你的插件所知道的(对吧?),因此插件无法为其导出实现。我想知道你在出口端设想的功能是什么? - Andrew Savinykh
导出部分有两种方法实现。第一种返回学生列表,第二种获取一个学生的ID并返回他/她的信息。收集所有dll文件以获取导出的核心库不知道'?'的类型可能是什么。 我还使用了'object'类型来表示'?',但它没有起作用,给出了这个错误:"导出'StudentsModule.DAL.StudentsAPI(ContractName ="SabteNamCore.Interfaces.ILightStudents")'无法分配给类型'SabteNamCore.Interfaces.ILightStudents'"。 - Babak Fakhriloo
1
泛型在.NET 4.0的MEF中不受支持。 它已经添加到.NET 4.5的MEF 2中,因此要么等待它,要么获取预览版。 - Louis Kottmann
1
这篇文章解释了为什么它不起作用 - http://codebetter.com/glennblock/2009/03/21/why-doesn-t-mef-support-open-generics-for-exports-because-mef-is-not-type-based/ - Gishu
2个回答

2

我几天前从另一个帖子中复制了答案:

试试

[Export(typeof(IService<>))]

从 typeof 运算符获取通用类型定义时,省略类型参数。对于具有多个类型参数的类型,请使用逗号表示类型的“arity”。例如:

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

1
那么这个是什么意思呢? [Import(typeof(ILightStudents<>))] public ILightStudents<?> StudentsAPI { get; set; } - Babak Fakhriloo
我没有看到你的整个代码,但是你的属性应该获取类型,无论是否使用MEF。例如:public ILightStudents<MyClass> StudentsAPI { get; set; }。 - blindmeis
3
这里的问题在于所需类型位于另一个库中,当前库(包含导入的库)不知道它是什么。 - Babak Fakhriloo

2

使用以下任一代码:

  • MefContrib中的代码或
  • MEF 2预览版。

这个功能已经被添加到两个版本中,它将包含在.NET 4.5中。


有没有什么有用的链接或示例?! - Babak Fakhriloo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接