У меня есть класс с параметризованным конструктор, используя AssistedInject следующим образом:Guice помощь инъекции
@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, так что надеюсь, я что-то очевидное ...
Спасибо, Марк
Спасибо за ответ Джесси - после долгих размышлений в конце я решил ввести RequestScoped PortfolioProvider и вызвать setter, чтобы инициализировать его в обработчике команд. Затем я могу приложить поставщика в другом месте приложения и получить доступ к портфолио. Я предполагаю, что область запроса использует threadlocal под обложками так или иначе? – MarkNS