我有一個類使用AssistedInject一個參數的構造函數如下:吉斯輔助注射
@Inject
Portfolio (QuoteDao dao, @Assisted Params params) {...}
我的命令來創建這個類的一個實例處理的servlet:
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,獲得了再次投資組合 - 看起來很笨重
會非常感激,如果有人可以幫助我在這裏?我與吉斯一個新手,所以希望我失去了一些東西明顯...
謝謝, 馬克
謝謝Jesse的回答 - 在最後經過深思熟慮之後,我決定注入一個RequestScoped PortfolioProvider並調用setter來在命令處理程序中初始化它。然後,我可以在應用程序的任何其他位置注入提供程序,並訪問投資組合。我猜測,請求範圍總之在某種程度上使用了一個threadlocal? – MarkNS