2011-09-06 69 views
0

我有一個類使用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,獲得了再次投資組合 - 看起來很笨重

會非常感激,如果有人可以幫助我在這裏?我與吉斯一個新手,所以希望我失去了一些東西明顯...

謝謝, 馬克

回答

0

ThreadLocal實際上可能是你最好的選擇。看一下SimpleScope,它使用ThreadLocals爲代碼塊的主體創建一個可注入的值。如果你已經使用了Guice的servlet集成,你需要編寫一個ServletFilter來進入和退出SimpleScope

+0

謝謝Jesse的回答 - 在最後經過深思熟慮之後,我決定注入一個RequestScoped PortfolioProvider並調用setter來在命令處理程序中初始化它。然後,我可以在應用程序的任何其他位置注入提供程序,並訪問投資組合。我猜測,請求範圍總之在某種程度上使用了一個threadlocal? – MarkNS

0

是否有可能將Portfolio作爲需要它的其他方法的參數?例如,而不是portfolioStrategy類的私有成員,它是否是一個執行參數?這取決於我猜想你需要多少個不同的地方。

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

什麼我發現是,有時傳遞數據對象爲戰略類允許的策略是固有的線程安全的,因爲它們包含的邏輯,但沒有自己的可變數據。這可以讓他們更多地用作單身人士。

+0

嗨麥克凱伊,感謝您的回答,但我不想這樣做的原因是因爲投資組合需要注入幾個不同的應用程序組件。因爲(儘管servlet是單例)線程安全不是問題,請求在請求範圍內執行。 – MarkNS

+0

我想這可能是這種情況,但值得一試,以防萬一它是合適的。祝你好運。 – mckamey