Eclipse RCP中的全局变量

我该如何解决这个问题:

我在我的主RCP插件中有usercredential informtion。 所有其他插件也应该有这些信息。 首选项存储是不可能的,因为首选项存储需要一个需要全局可用的节点名称。

有没有可能实现全局变量?

谢谢!

有几个选择。


快速而肮脏的方法是将全局变量的getter放入其中一个插件的激活器中。 然后你就像你的全球一样:

SomePluginActivator.getDefault().getGlobalData()

这有使得插件紧密耦合的缺点,这有点违背了插件架构的精神。


第二种方法是使用工作台服务。 虽然它将org.eclipse.ui的依赖引入到您的插件中,但这有点好一些。 在提供全局数据的插件中,创建org.eclipse.ui.services的扩展。 您定义服务接口和服务工厂。 工厂应该返回接口的实现。 您的客户端通过向服务定位器询问服务接口的实例来检索全局服务的实例。 该平台使用您的工厂来创建服务的实例:

IMyGlobalService service = (IMyGlobalService) PlatformUI.getWorkbench().getService(IMyGlobalService.class);

这是熟悉的服务定位器模式。 这种方法的好处是某些全球数据的消费者不需要知道它来自何处。 为了增加灵活性,您可以在一个插件中声明接口,在另一个插件中声明工厂和实现,以便您可以交换实现。


第三种方法是使用扩展点。 我自己没有试过这个,但似乎你应该能够在一个提供全局数据的插件中声明一个扩展点,然后将全局数据注入到扩展它的插件中。


最后一种方法是使用OSGi服务。 我对这种方法最不熟悉。 您将编写OSGi服务,其他插件将使用OSGi框架来定位服务。 这与上面的工作台服务类似,但它不直接使用Eclipse RCP。 您还应该阅读有关白板模式的信息 (警告:PDF链接)。

我意识到这个问题很久以前就提出过了,但我还没有找到关于这个问题的最新讨论。

我是RCP开发的新手,但为什么不使用IEclipsePreferences? 写:

 IEclipsePreferences rootNode = Platform.getPreferencesService().getRootNode(); rootNode.put("currentFileName", "my.file.name.txt"); 

读到其他地方:

 IEclipsePreferences rootNode = Platform.getPreferencesService().getRootNode(); String currentFileName = rootNode.get("currentFileName", null);