инъекция с помощью guice - PullRequest
       2

инъекция с помощью guice

0 голосов
/ 07 сентября 2011

У меня есть класс с параметризованным конструктором, использующим AssistedInject следующим образом:

  @Inject
  Portfolio (QuoteDao dao, @Assisted Params params) {...}

Я создаю экземпляр этого класса в сервлете обработки команд:

  public class Handler {
    @Inject Strategy strategy;
    Result execute(Action action) {
      Portfolio portfolio = portfolioFactory.create(action.params);
      strategy.execute();
    }
  }

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

  public class Strategy {
    Portfolio portfolio; <-- how should I get this here?
    @Inject
    public Strategy(QuoteDao dao, ??) {...}
    public execute();
  }

Пример несколько упрощен - невозможно просто передатьпортфель как часть вызова execute ().

Я продумал различные решения, но ни одно из них не кажется идеальным:

  • Внедрить PortfolioProvider - но как поставщик получает доступв портфель?
  • Сохраните портфель в обработчике против вошедшего в систему пользователя (я использую appengine), затем используйте вошедшего в систему пользователя для извлечения в провайдере - но я бы хотел, чтобы система могладля работы с анонимными пользователями
  • Хранить портфель в статическом ThreadLocal, снова обращаться к провайдеру - кажется очень неуклюжим

Был бы очень признателен, если бы кто-то мог помочь мне здесь?Я новичок в Guice, так что, надеюсь, я упускаю что-то очевидное ...

Спасибо, Марк

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Возможно ли, чтобы Portfolio был параметром для других методов, которым это необходимо? Например, вместо portfolio, являющегося закрытым членом класса Strategy, это должен быть параметр execute? Я думаю, это зависит от того, сколько разных мест вам нужно.

public class Strategy {
    @Inject
    public Strategy(QuoteDao dao, ??) {...}
    public execute(Portfolio portfolio);
}

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

0 голосов
/ 07 сентября 2011

ThreadLocal может быть вашим лучшим выбором.Взгляните на SimpleScope , который использует ThreadLocals для создания значения, которое можно ввести для тела блока кода.Если вы уже используете интеграцию сервлетов Guice, вам нужно написать ServletFilter для входа и выхода из SimpleScope.

...