2011-09-06 8 views
0

私は、システムの他のコンポーネントのポートフォリオへの参照を取得する必要があります。理想的にはコンストラクタの一部としてインクルードされていますが、注入時には使用できないため、これは不可能です。Guiceのアシスト射出

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

例は幾分簡略化され - それは単に実行()コールの一部としてポートフォリオを通過することはできません。

私は、さまざまなソリューションを通じて考えたが、どれも理想的なように見えるん:

  • がPortfolioProviderを注入する - しかし、どのプロバイダは、ポートフォリオへのアクセス を取得していますか?
  • は反対ハンドラでポートフォリオを保存し、ユーザー (私はAppEngineのを使用しています)、そして プロバイダで取得するにはログインしているユーザーを使用してログインして - しかし、私は匿名 ユーザーを処理できるようにシステムをしたいと思います
  • ストア静的にThreadLocal、再び プロバイダでアクセスにおけるポートフォリオは - 誰かがここで私を助けることができれば非常にそれをお願い申し上げ

非常に不格好と思われますか?私はそううまくいけば、私は何かを明らかに不足しています...

おかげで、 マーク

答えて

0

ThreadLocalが実際にあなたの最善の策かもしれない、Guiceので初心者です。 ThreadLocalsを使用してコードブロックの本体に対して値を注入可能にするSimpleScopeを見てください。 Guiceのサーブレット統合をすでに使用している場合は、SimpleScopeを入力して終了するにはServletFilterと書かなければなりません。

+0

答えをくれてありがとうJesse - 私はRequestScoped PortfolioProviderを注入し、setterを呼び出してコマンドハンドラで初期化することにしました。私はその後、アプリケーションのどこにでもプロバイダを注入し、ポートフォリオにアクセスすることができます。私は、要求スコープが何とかとにかくカバーの下にthreadlocalを使用していると思いますか? – MarkNS

0

Portfolioを必要とする他の方法のパラメータにすることはできますか?たとえば、portfolioの代わりにStrategyクラスのプライベートメンバーである場合は、実行のパラメータにする必要がありますか?それはあなたがそれを必要とする場所がいくつあるかによって変わります。私が見つけた何

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

は時々戦略クラスにデータオブジェクトを渡すと、彼らはロジックが、自分自身の無可変データが含まれているため、戦略は本質的に、スレッドセーフであることができることです。これにより、それらをシングルトンとしてより多く使用することができます。

+0

こんにちはMcKamey、答えてくれてありがとうございます。しかし、私がしたくない理由は、ポートフォリオを複数の異なるアプリケーションコンポーネントに注入する必要があるからです。スレッドセーフは懸念事項ではありません(サーブレットはシングルトンですが)、リクエストはrequestscopeで実行されます。 – MarkNS

+0

私は、それはおそらくケースだったが、それがフィットである場合のショットの価値があると思った。がんばろう。 – mckamey