Проблема Джина с использованием GWT - GWT.create (someClass.class) возвращает каждый раз новый экземпляр - PullRequest
1 голос
/ 02 июня 2011

вот моя проблема.Я использую Gin в проекте gwt, я использую GWT.create (SomeClass.class) для получения экземпляра, но проблема в том, что я хочу, чтобы экземпляр signleton и для этой цели я связывал этот класс в модуле приложения как singleton.Каждый том я выполняю GWT.create (TemplatePanel.class), он возвращает разные экземпляры ... почему ??Вот фрагмент моего кода.Модуль

public class AppClientModule extends AbstractGinModule
{
protected void configure()
{
  bind(MainPanel.class).in(Singleton.class);
  bind(TemplatePanel.class).in(Singleton.class);
}
} 

Инжектор

@GinModules(AppClientModule.class)
public interface AppInjector extends Ginjector
{
  MainPanel getMainForm();
  TemplatePanel getTemplateForm();
}

TemplatePanel

public class TemplatePanel extends VerticalPanel
@Inject
public TemplatePanel()
{
  this.add(initHeader());
  this.add(initContent());
}
..

MainPanel

public void onSuccess(List<MyUser> result)
    {
.......
  TemplatePanel temp = GWT.create(TemplatePanel.class);

.......
}

И точка входа

private final AppInjector injector = GWT.create(AppInjector.class);
public void onModuleLoad()
{
  MainPanel mf = injector.getMainForm();
  TemplatePanel template = injector.getTemplateForm();
  template.setContent(mf);
  RootPanel.get().add(template);
}

Ответы [ 2 ]

7 голосов
/ 02 июня 2011

GWT.create(..) не работает с GIN, он просто создает объект обычным способом GWT.Вы должны либо:

  1. Inject TemplatePanel in MainPanel, либо

  2. Создать инжектор (возможно статическим методом), а затем получить TemplatePanel.

У меня обычно есть статическая ссылка на инжектор (поскольку вам нужно только один на приложение), поэтому я могу получить к ней доступ в любом месте:

@GinModules(AppClientModule.class)
public interface AppInjector extends Ginjector
{
    AppInjector INSTANCE = GWT.create(AppInjector.class);

    MainPanel getMainForm();
    TemplatePanel getTemplateForm();
}

(Примечание: постоянный интерфейсполя по определению являются общедоступными и статическими, так что вы можете их пропустить.)

Тогда вы будете использовать:

TemplatePanel temp = AppInjector.INSTANCE.getTemplateForm();
0 голосов
/ 04 июля 2013

GWT.create просто вызывает новый XXX, где XXX - это литерал класса, который вы ему передали. Тем не менее, он делает некоторую магию, когда класс XXX имеет определенные правила в модуле, определенном для него, иначе говоря, отложенное связывание. Я могу использовать Gwt.create (YYY), и есть правило, которое гласит, что если пользовательский агент Internet Explorer 2 использует ZZZ, тогда он будет.

...