Ссылки по перекрестной активности с использованием GWT с джином

StackOverflow https://stackoverflow.com/questions/5827534

Вопрос

У меня есть приложение GWT MVP с использованием мероприятий и мест. Это вдохновлено образцом Мауро Бертапель (в эта ветка), по -видимому, на основе некоторых из Томас Бройерработа.

Вот проблема: у меня есть LoginActivity, сделайте вызов RPC, который для успешного входа в систему возвращает пользователя. У этого пользователя есть роль (например, администратор, обычный пользователь, гость). Несколько просмотров и мероприятий, включая NavigatorView, зависят от этой роли того, что они показывают или делают. Как получить этот экземпляр пользователя на другие действия?

У меня нет клиентом; Инъекция (джин) используется для создания мнений в деятельности, которые предоставляют мою деятельность/докладчики, а провидеры деятельности вводят в мою деятельность. Таким образом, это может уменьшить вопрос джина: как мне получить ссылку на пользователя, где это необходимо? Это похоже на это так вопрос о глобальных ссылках в MVP.

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

Большое спасибо.

РЕДАКТИРОВАТЬ 1: Несмотря на все мои усилия по поиску, чтобы по аналогичному вопросу, я только что нашел этот вопрос Что в значительной степени идентично моему (так ли такой алгоритм поиска «связанных» ссылок, чем поиск?). Я думаю, что джин ответ Дэвида находится на правильном пути.

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

Это было полезно?

Решение

У меня были аналогичные требования к недавнему проекту.

Когда я получаю ответ от RPC входа в систему (или вход в систему), я отправляю пользовательскую аутентификацию на Eventbus. Все действия, которые заинтересованы в этом слушании для этого события. AuthenticationEvent имеет ссылку на объект Appuser, который является нулевым, если пользователь только что вышел из строя. Appuser содержит все необходимые данные (привилегии, группы и т. Д.), чтобы действия могли проверять их и действовать на них.

О глобальных ссылках: вы можете провести класс со статическими методами, предоставляющими данные, которые вам нужны. В этом классе внутренне содержится однозначные ссылки на необходимые экземпляры. В моем примере у меня есть статический метод apputils.getcurrentuser (). Внутренне он содержит ссылку на Appuser, а также слушает аутентификацию, чтобы установить/сбросить это поле.

В качестве примечания: не полагайтесь на сторону клиента, чтобы обеспечить ограничения доступа - вы должны разделить свои сервлеты RPC на две группы: государственные и частные. Общественный может получить доступ к кому -либо (это в основном вход в систему/вход RPC и некоторая другая публичная информация RPC), в то время как частное RPC требует, чтобы пользователь был аутентифицирован. Ограничения доступа могут быть установлены на пути/сервлета: http://code.google.com/appengine/docs/java/config/webxml.html#security_and_authentication

Обновлять:

  1. Как вы отмечали, класс со статическими методами не рекомендуется в этой настройке, потому что он не подлежит замене, и это предотвращает тестирование (что является целым вопросом использования джина).

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

  3. Использовать Provider или нет просто вопрос, если вы хотите отложить инициализацию зависимостей (Apputil - это зависимость). Поскольку Apputils является синглтоном для всего приложения, это не имеет смысла инициализировать его ленивым.

  4. Иногда у вас будет ситуация, когда на экране показано несколько действий (в моем случае это был Menubar и Infobar). В этом случае, когда пользователь войдет в систему, вам понадобится способ уведомить их об изменениях. Используйте Eventbus.

Другие советы

То, что я использую на стороне сервера с Guice, и будет работать так же хорошо на стороне клиента,-это привязаться к пользовательскому поставщику. В вашем случае, однако, вам придется сделать поставщика синглтоном и выдвинуть в него значение из вашего обратного вызова RPC (вместо того, чтобы вытащить его из какого -то контекста). Сначала вам понадобится конкретный провайдер:

@Singleton
public class CurrentUserProvider implements Provider<User> {
  private User currentUser;

  public User get() { return currentUser; }
  public void setCurrentValue(User currentUser) {
    this.currentUser = currentUser;
  }
}

Ты бы связал User поставщику: bind(User.class).toProvider(CurrentUserProvider.class)В ваш обратный вызов RPC вы бы ввели CurrentUserProvider так что вы можете setCurrentValue Но везде, где вы бы вводили Provider<User> хранить CurrentUserProvider в качестве детали реализации. Для очень недолговечных объектов вы можете прямо ввести User ценность, а не Provider<User>.

Если вам нужно уведомить объекты об изменении стоимости, вы можете отправить событие на глобальном автобусе событий.

С другой стороны, вы всегда можете использовать бетон CurrentUserProvider Тип (который не должен был бы реализовать Provider больше) и, возможно, сделать это HasValueChangeHandlers Таким образом, вы могли бы зарегистрировать слушателей на это, а не на автобусе событий (но вам придется убрать за себя в своей деятельности » onStop а также onCancel Чтобы избежать утечек памяти, в то время как о нем автоматически позаботятся, если вы зарегистрируете обработчики на автобусе событий в onStart).

(Если вы спросите меня, я бы предпочел уйти с аутентификацией из приложения, когда это возможно)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top