Глобальные переменные в Eclipse RCP - PullRequest
3 голосов
/ 16 марта 2010

как мне решить эту проблему:

У меня есть информация о пользователях в моем основном плагине RCP. Все остальные плагины также должны иметь эту информацию. Хранилище предпочтений невозможно, так как хранилищу предпочтений также требуется имя узла, которое должно быть доступно глобально.

Есть ли возможность реализовать глобальные переменные?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 16 марта 2010

Есть несколько вариантов.


Быстрый и грязный подход - поместить геттер для вашей глобальной переменной в активатор одного из ваших плагинов. Тогда вы просто получите свой глобальный, как:

SomePluginActivator.getDefault().getGlobalData()

Это имеет обратную сторону, заключающуюся в том, что ваши плагины тесно связаны, что несколько противоречит духу архитектуры плагинов.


Второй подход заключается в использовании службы рабочей среды. Это немного лучше, хотя в ваши плагины вводится зависимость от org.eclipse.ui. В плагине, который предоставляет глобальные данные, создайте расширение org.eclipse.ui.services. Вы определяете сервисный интерфейс и сервисную фабрику. Фабрика должна вернуть реализацию интерфейса. Ваши клиенты получают экземпляр глобальной службы, запрашивая указатель службы для экземпляра интерфейса службы. Платформа использует вашу фабрику для создания экземпляра сервиса:

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

Это знакомый шаблон поиска сервисов. Преимущество этого подхода заключается в том, что потребители некоторых глобальных данных не должны знать, откуда они берутся. Для дополнительной гибкости вы можете объявить интерфейс в одном плагине, а фабрику и реализацию в другом, чтобы можно было менять реализации.


Третий подход - использовать точку расширения. Я сам не пробовал этого, но, похоже, вы должны иметь возможность объявить точку расширения в плагине, который предоставляет глобальные данные, а затем внедрить глобальные данные в плагины, которые его расширяют.


Последний подход заключается в использовании службы OSGi. Я наименее знаком с этим подходом. Вы бы написали сервис OSGi, а другие плагины использовали бы каркас OSGi, чтобы найти сервис. Это похоже на сервисы верстак выше, но он не использует Eclipse RCP напрямую. Вы также должны прочитать о шаблоне доски (предупреждение: ссылка PDF).

1 голос
/ 30 октября 2013

Я понимаю, что этот вопрос был задан давно, но я не нашел более свежую дискуссию по этому вопросу.

Я новичок в разработке 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);
...