【问题标题】:using generic interfaces in MEF在 MEF 中使用通用接口
【发布时间】:2023-03-22 19:17:01
【问题描述】:

我正在开发一个启用 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; }

在其他具有 [export] 属性的库项目中实现 IHost 或其他接口存在问题,但这里的问题是我已经像这样声明了 ILightStudents:

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

        T GetStudent(long id);

    }

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

你能帮帮我吗?

已编辑

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

【问题讨论】:

  • 我能想到的唯一可以形成 > 的地方是类上的类型参数,该类包含 StudentAPI 属性。因为这个类不是你的插件知道的东西(是吗?)插件现在有办法为它导出实现。我想知道您在导出方面设想的功能是什么?
  • 导出端实现了两种方法。第一个返回学生列表,第二个获取一个学生的 id 并返回她/他的信息。收集所有 dll 文件以获取导出的核心库不知道“?”的类型是什么。可能。我还为 '?' 使用了 'object' 类型,但它不起作用并给了我这个错误:“导出 'StudentsModule.DAL.StudentsAPI (ContractName="SabteNamCore.Interfaces.ILightStudents")' 不能分配给类型 ' SabteNamCore.Interfaces.ILightStudents'。”
  • .NET 4.0 的 MEF 不支持泛型。它已被添加到 .NET 4.5 中的 MEF 2 中,因此请等待它或获取预览。
  • 这解释了为什么它不起作用 - codebetter.com/glennblock/2009/03/21/…

标签: c# .net mef


【解决方案1】:

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

试试

[Export(typeof(IService<>))]

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

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

【讨论】:

  • 那么 [Import(typeof(ILightStudents))] public ILightStudents> StudentsAPI { get;放; }
  • 我没有看到你的整个代码,但你的属性应该得到类型,无论是否有 MEF。例如。公共 ILightStudents StudentsAPI { get;放; }
  • 这里的问题是该类型位于其他库中,当前库(包含导入的那个)不知道它是什么。
【解决方案2】:

使用任一:

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

此功能已添加到两者中 - 它将包含在 .NET 4.5 中。

【讨论】:

  • 有什么有用的链接或示例吗?!
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多