Синглтон в Ваадине - PullRequest
       7

Синглтон в Ваадине

0 голосов
/ 30 ноября 2018

Является ли хорошей практикой использование Singleton pattern для GUI (прикрепление окна для моего случая) в Vaadin?

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


До этого варианта использования я просто добавлял окно в графический интерфейс, как показано ниже:

  this.communicationWindow = new CommunicationConfigWindow();
  this.configSettingsButton.addClickListener( e -> {
     if ( !UI.getCurrent().getWindows().contains( this.communicationWindow )
              && this.communicationWindow != null )
     {
        this.communicationWindow.init( this.config );
        this.getUI().addWindow( this.communicationWindow );
     }
  } );

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

this.communicationWindow = new CommunicationConfigWindow();

я просто превратил его в singleton, как показано ниже, и просто добавил try/catch block;

this.communicationWindow = CommunicationConfigWindow.getInstance();
this.communicationWindow = new CommunicationConfigWindow();
this.configSettingsButton.addClickListener( e -> {
    if ( !UI.getCurrent().getWindows().contains( this.communicationWindow )
                  && this.communicationWindow != null )
    {
       this.communicationWindow.init( this.config );
       try
       {
           this.getUI().addWindow( this.communicationWindow );
       }
       catch(IllegalArgumentException ex)
       {
           Notification.show( "Configuration invalid", Type.WARNING_MESSAGE);
       }
    }
});

Теперь, это не позволяет многим пользователям отображать это окно (что я и хочу), но есть 3 вещи:

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

Любые подходы, предложения приветствуются.

Спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Это не будет работать таким образом.

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

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

Для этого вам необходимо включить Push в вашем проекте, поскольку сервер должен отправлять обновления «неактивным» пользователям.

https://vaadin.com/docs/v8/framework/articles/BroadcastingMessagesToOtherUsers.html

...