我有一个RCP应用程序,它使用扩展点来定义各种可插入功能。
在某些情况下,我有一个扩展点,逻辑上可以一次激活许多实现:例如,一个DataFeed点,应用程序可以支持其中许多。
在其他情况下,只有在应用程序的运行实例中有一个单独的实现才有意义。我确实希望用户能够在它们之间切换,卸载/重新安装插件这样做并不是非常用户友好。
我想出办法处理这个问题的方法是将扩展点定义为使用IExecutableExtensionFactory的工厂,然后每个插件都必须优先说明它是否处于活动状态。如果它不活动,则工厂返回null,应用程序查看下一个选项。如果没有,那么使用一些合理的默认值。
虽然这感觉不太正确,但我想知道是否还有一种替代方法,我尚未对这种行为进行建模。任何人都有办法让这感觉更好吗?
答案 0 :(得分:2)
在您的解决方案中,决定扩展程序是否处于活动状态的责任分配给扩展程序提供程序(工厂)。无论选择活动扩展的实际逻辑(在任何给定时刻),我都会说在扩展 point 提供程序中控制更好,也就是说,在调用的类中工厂。那是因为扩展提供者彼此不了解(或者不应该知道)。
这实际上是Eclipse中常见的情况,它通常通过扩展为扩展点处理程序定义其他属性来决定,以决定哪个扩展应该是活动的,具体取决于工作台状态(例如,参见 enabledWhen org.eclipse.ui.handlers扩展点的属性)或用户首选项。