Где хранить «глобальные» данные в Eclipse RCP Application? - PullRequest
3 голосов
/ 07 августа 2009

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

Скажем, мне нужно инициализировать приложение с классом, который содержит аутентифицированную информацию о пользователе. Я использовал мой WorkbenchWindowAdvisor (не в том месте?), Чтобы выполнить некоторую инициализацию (например, аутентификацию), чтобы решить, какой вид показать. Как только это будет сделано, отображается вид. Теперь этому представлению также требуется доступ к информации о пользователе, которую я ранее получил / произвел.

Вопрос в том, как это представление должно получить эти данные? Вид подключен в plugin.xml. Я не вижу способа предоставить данные для просмотра. Итак, я предполагаю, что представление должно каким-то образом получить его. Но какое у него место для его извлечения? Я думал о включении статических переменных в реализацию IApplication, но это было неправильно. Любые советы или указатели высоко ценится. Благодаря.

1 Ответ

5 голосов
/ 13 августа 2009

Проблема, с которой вы здесь сталкиваетесь, на мой взгляд, не связана с RCP. Это больше архитектурная проблема. Ваше мнение связано с бизнес-логикой и! Решение может быть сделано двумя (общими) шаблонами проектирования:

  1. Модель-Вид-Контроллер (MVC)
  2. Model-View-Presenter (MVP)

Вы можете найти много информации об этом в Интернете. Я собираюсь указать возможное решение для вашей конкретной проблемы с использованием MVP.

Вам нужно будет создать несколько проектов. Один из них, конечно, плагин RCP, давайте назовем его rcp.view . Теперь вы создаете еще один, который не вносит вклад пользовательского интерфейса (только для начала org.eclipse.core.runtime) и называете его rcp.presenter . Для упрощения этот плагин также будет моделью на данный момент.

Следующие шаги:

  1. Добавьте rcp.presenter к зависимости от rcp.view (его важно, что у докладчика нет ссылка на вид)
  2. Экспорт всех ваших пакетов собираюсь создать в rcp.presenter так они видны
  3. В rcp.presenter создайте интерфейс IPerspective , который имеет несколько методов например ( showLogiDialog (), showAdministratorViews (пользователь-пользователь), showStandardViews (пользователь-пользователь) )
  4. Создать класс PerspectivePresenter , который принимает IPerspective в конструкторе и сохраняет его в атрибуте
  5. В rcp.view перейдите к своей Перспективе, реализуйте свой интерфейс IPerspective , и в конструкторе создайте новую ссылку Presenter = new PerspectivePresenter (this)
  6. вызов Presenter.load () и неумолимым это в презентере может быть вот так

код:

public void load()
{
  User user = view.showLoginDialog(); // returns a user with the provided name/pw
  user.login(); // login to system/database
  if(user.isAdministrator())
    view.showAdministratorViews(user);
  else
    view.showStandardViews(user);
}

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

Для каждого просмотра это происходит одинаково, вам нужен докладчик для представления, который выполняет операции и сообщает представлению (используя интерфейс), что отображать и передавать окончательные данные. Представление не заботится о логике. Это также очень полезно при использовании JFace-Databindings (тогда только связанные данные передаются в представление). Например, WorkbenchWindowAdisor просто создаст все, что нужно в приложении. Другие представления, перспективы, затем могут включать / отключать меню и так далее, в зависимости от полученных данных (например, когда isAdministrator, вы можете включить специальное adminMenu).

Я знаю, что это довольно сложный подход, но Eclipse RCP предназначен для больших (как следует из названия, насыщенных) приложений. Таким образом, вы должны провести некоторое время в правильной архитектуре. Мое первое приложение RCP было таким, как вы описали ... Я никогда не знал, где хранить вещи и как обращаться со всеми ссылками. На своей работе я узнал о MVP (и я все еще учусь). Понять концепцию нужно время, но оно того стоит.

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

...