У меня есть класс с параметризованным конструктором, использующим 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, так что, надеюсь, я упускаю что-то очевидное ...
Спасибо, Марк