GWT - GIN - GWTP - Проблема с инъекцией диспетчера - PullRequest
2 голосов
/ 13 сентября 2011

Я нахожусь в ситуации, когда кто-то уже может быть. Я использую GWTP в своем приложении. GWTP использует GIN в качестве клиентской стороны внедрение зависимости. GWTP также использует механизм Dispatcher для отправки запроса на серверную часть.

Теперь, есть некоторые классы (PRESENTERS), которые вводятся GWTP, у меня есть некоторые другие классы, которые создаются во время выполнения без внедрения, что означает использование «новой» работы с клавишами. Давайте рассмотрим пример:

// Injected
class Dispatcher {
}

// Injected
Class A {
    @Inject // I can do this and access the disp without any hurdle.
    Dispatcher disp;
}

// Created using "new" keywork 
class B {
    //@Inject I can't do this because of B is not an injected class. Correct me if I am wrong here 
    Dispatcher disp;
}

Итак, мне нужно получить доступ к классу Injected в классах без инъекций. Вы можете подумать, что я не пробовал метод GWT.Create (Injector.class). Я пробовал это, и я могу получить этот объект в неинтегрированных классах, но объект Dispatcher - это нечто иное, он увеличивает (добавляет) «/ dispatch /» к своему базовому URL. Это означает, что мне нужно иметь тот же объект, который используется GWTP для внутреннего использования. И GWTP создает GIN INJECTOR в точке входа.

Одно из решений состоит в том, чтобы поместить один и тот же GIN INJECTOR в сеанс на стороне клиента (Static Hashmap) и использовать его в неинъекционных классах (я также пробовал это решение, и оно работает как charm).

Мне нужно более совершенное решение, которое может работать.

Заранее спасибо.

1 Ответ

4 голосов
/ 14 сентября 2011

Инъекция похожа на (хороший) вирус, когда вы начинаете его использовать, он распространяется по вашему исходному коду.

Как вы сказали, вы не можете внедрять экземпляры в объекты, созданные с помощью ключевого слова "new". Я могу вспомнить пару быстрых, грязных и не рекомендуемых альтернатив:

  • Когда вы создаете свой инжектор (через GWT.create(MyInjector.class)), присвойте его публичной статической переменной. MyInjector должен иметь метод getDispatcher(), который возвращает Dispatcher. Это действительно грязная альтернатива, и я бы не рекомендовал ее, потому что каждый компонент, который ее использует, будет очень сложно протестировать.
  • Чьим созданием экземпляра B? Обходите иерархию, пока не найдете объект, созданный с помощью инъекции, затем введите Dispatcher и передайте его полностью создателю B.

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

...