MEF组成和导入选择中的拦截

本文关键字:选择 导入 MEF | 更新日期: 2023-09-27 18:23:37

所有

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

我有三种方法:

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

  2. MEF组成中的拦截。我不确定这是否可能,也不知道怎么做。但如果有一种方法可以让我们在构图过程中截取,这可能是最好的方法。

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

MEF组成和导入选择中的拦截

使用[ImportMany]为同一签名获取所有可能的导入,然后从导入列表中为特定条件(配置文件或其他文件)选择一个导入怎么样?

编辑:我喜欢你的第三个建议,我认为这个可能很容易。你的包装器用[ImportMany]处理真实的接口,插件会向你的包装程序请求GetTheOneInterface()。