3

我该如何解决这个问题:

我的主 RCP 插件中有用户凭据信息。所有其他插件也应该具有该信息。偏好存储是不可能的,因为偏好存储也需要一个需要全局可用的节点名。

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

谢谢!

4

2 回答 2

8

有几个选项。


快速而肮脏的方法是将全局变量的 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 链接)。

于 2010-03-16T19:13:17.907 回答
1

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

我是 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);
于 2013-10-30T15:53:54.293 回答