C# MEF合成和导入选择中的拦截

C# MEF合成和导入选择中的拦截,c#,mef,interception,C#,Mef,Interception,每个人 问题是,如果存在两个导出的组件具有相同的导出签名,但只应导入一个(这是可能的,实际示例是安装新插件以替换旧插件,而不卸载旧插件)。我们可以提供一个配置文件来告诉应该导入哪个组件,但问题是如何告诉MEF正确的选择 我有三种方法: 使用自定义目录,筛选可用插件。但是假设A导入组件A和B导入组件B,而组件A和B具有相同的导出签名。自定义目录无法处理此问题,除非我们为每个组件创建新的自定义目录 MEF合成中的拦截。我不确定这是否可能,也不知道如何做到。但如果有一种方法让我们在合成过程中拦截,这可

每个人

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

我有三种方法:

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

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

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


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


    编辑:我喜欢你的第三条建议,我认为这条建议很简单。您的包装器使用[ImportMany]处理真正的接口,插件要求您的包装器提供GetTheOneInterface()。

    是的,[ImportMany]可以解决,但这将迫使所有组合组件自行处理插件选择逻辑。我正试图避免这种情况。请看,这可能会有所帮助,实现ExportProvider可能会遇到链接的方法2TX。如果你有你的东西工作,请张贴在这里作为一个答案。