大家
问题是,如果存在两个具有相同导出签名的导出组件,但只应导入一个(这是可能的,实际示例是安装新插件来替换旧插件而不卸载旧插件。)。我们可以提供一个配置文件来告诉应该导入哪个组件,但问题是如何告诉MEF正确的选择?
我有三种方法:
使用自定义目录,过滤可用的插件。但假设这样的情况:A 导入组件 A,B 导入组件 B,而组件 A 和 B 具有相同的导出签名。自定义目录无法处理此问题,除非我们为每个组件创建新的自定义目录。
MEF 合成中的拦截。我不确定这是否可能,也不知道如何实现。但如果有一种方法让我们在合成过程中进行拦截,这可能是最好的。
使用导入包装器而不是真正的接口(interface)。当组件构建时,它会初始化包装器并让包装器处理选择逻辑(例如提示一个窗口并让用户选择一个或读取配置)
最佳答案
如何使用 [ImportMany] 获取同一签名的所有可能导入,然后从该导入列表中选择您想要的特定条件(配置文件或其他内容)?
编辑:我喜欢你的第 3 条建议,我认为这个可能很简单。您的包装器使用 [ImportMany] 处理真实的接口(interface),并且插件会向您的包装器询问 GetTheOneInterface()。
关于c# - MEF 组合拦截和导入选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188738/