c# - MEF 组合拦截和导入选择

标签 c# mef interception

大家

问题是,如果存在两个具有相同导出签名的导出组件,但只应导入一个(这是可能的,实际示例是安装新插件来替换旧插件而不卸载旧插件。)。我们可以提供一个配置文件来告诉应该导入哪个组件,但问题是如何告诉MEF正确的选择?

我有三种方法:

  1. 使用自定义目录,过滤可用的插件。但假设这样的情况:A 导入组件 A,B 导入组件 B,而组件 A 和 B 具有相同的导出签名。自定义目录无法处理此问题,除非我们为每个组件创建新的自定义目录。

  2. MEF 合成中的拦截。我不确定这是否可能,也不知道如何实现。但如果有一种方法让我们在合成过程中进行拦截,这可能是最好的。

  3. 使用导入包装器而不是真正的接口(interface)。当组件构建时,它会初始化包装器并让包装器处理选择逻辑(例如提示一个窗口并让用户选择一个或读取配置)

最佳答案

如何使用 [ImportMany] 获取同一签名的所有可能导入,然后从该导入列表中选择您想要的特定条件(配置文件或其他内容)?

编辑:我喜欢你的第 3 条建议,我认为这个可能很简单。您的包装器使用 [ImportMany] 处理真实的接口(interface),并且插件会向您的包装器询问 GetTheOneInterface()。

关于c# - MEF 组合拦截和导入选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188738/

相关文章:

c# - 在 Windows 8 中获取类型程序集

检查有限线截取 C

apache-camel - 如何在 Camel 中保留来自外部系统的所有传入消息

无法识别 MySql 查询中的 C# 变量

c# - MEF:无法导入其他类?

c# - 使用带有目标对象信息的 MEF 注入(inject)对象

dependency-injection - 使用 StructureMap 3.* 进行拦截

c# - DropDownListFor optionLabel null 给出 "call is ambiguous"

C# - GetValue - 对象与目标类型不匹配

c# - 显示进度条,直到 Webgrid 完全加载并分页到 MVC 中 Webgrid 中的下一页或上一页