保険データ変換プラットフォームでGuiceの使用を開始する準備をしていますが、Guiceのドキュメントや見つけた投稿では直接取り上げられていないような興味深いシナリオに遭遇しました。
私たちのプラットフォームは、いくつかの重要な領域でカプセル化されたコンテキスト(EC)パターンを使用しています。たとえば、10個のポリシーのセットを処理していると想像してください。新しいポリシーの処理を開始するときはいつでも、PolicyContext
オブジェクトを作成し、ポリシー番号、州、会社などのプロパティを初期化する必要があります。これPolicyContext
は、変換プロセスに関係する多くのクラスの依存関係です。
PolicyContext
(およびアプリ内の他の*Context
オブジェクト)は、特定のドメイン領域に厳密に焦点を合わせた値オブジェクトであることに注意してください(基本的な、遍在的に必要なポリシー情報を表します)。あなたの間のパターンの達人がまだこれをアンチパターンであると考えているかどうかを知りたいと思います(MiskoHeveryがhttp://misko.hevery.com/2008/07/18/breaking-the-law-で議論したように) of-demeter-is-like-for-a-needle-in-the-haystack /)これらは純粋に価値のあるオブジェクトであり、確かに「台所の流し台」を表すものではありませんが。</ p>
現在、PolicyContext
可能な限り最悪の方法で管理しています。静的グローバル変数、policyContext
がありpolicyContext.initialize(String company, String state, String policyNum)
、新しいポリシーの処理を開始するたびに呼び出されます。
私の目標は、Guiceがこれらのコンテキストオブジェクトをアーキテクチャ的に最適な方法で管理し、概念的には、新しいポリシーの処理を開始するたびに次のことを行うことです。
- Guiceは古いものを破棄し
PolicyContext
ます。 - Guiceは、データベースからのパラメーター
PolicyContext
を使用して、新しい不変(臭い初期化メソッドなし)を構築します。company/state/policyNum
- Guiceは、すでに構築
PolicyContext
されているものを、それを必要とするすべてのクラスに注入します。
これが私の暫定的なアプローチです:
- カスタムスコープを作成します。これは、 http: //code.google.com/p/google-guice/wiki/CustomScopesにあるGuiceバッチスコープのサンプルに似ています。ここで、バッチの境界は外部で決定されます。このスコープでは、新しいポリシーの処理を開始し、1)前の「バッチ」を終了して新しいポリシーを開始できます。Q:前述のURLにリストされているとおりにGuiceバッチスコープのサンプルを使用できない理由は何ですか?
依存関係がないため、すべての
PolicyContext
コンストラクターパラメーターにAssistedInjectを使用します(これは少し奇妙に思えます)。そのアプローチを採用してを生成すると仮定すると、新しいポリシーの処理を開始すると、次のようなコードが作成されます。PolicyContextFactory
… scope.exit(); scope.enter(); @Inject private PolicyContextFactory policyContextFactory; policyContextFactory.create(company, state, policyNum); // the parameters come from a database record. // Note that we don’t need to actually store the created instance; it will be injected elsewhere into various class constructors. …
これは最適だと思いますか?より単純なアプローチがあるかもしれないことを私は知っています(例えばPolicyContext
、新しいポリシーを処理するときはいつでも、新しい特定のインジェクターを作成し、それは効果的に新しいものを作成しますPolicyContext
)。ただし、これはアーキテクチャの中心的な側面であるため、妥協したくありません。
別のオプションは、このシナリオでDIの使用を控え、個別のメソッドPolicyContextManager
を持つ静的クラスを使用することです。前者のメソッドは現在のメソッドを破棄して新しいメソッドを作成/保存するファクトリであり、後者のメソッドは単に「アクティブ」を返します)。しかし、のようなコードをたくさん書くので、私のコードは手動DIを実行することになります。とにかくGuiceを使い始めるつもりなので、このアプローチは最適ではないようです。create
get
PolicyContext
PolicyContext
methodThatNeedsPolicyContext(PolicyContextManager.get(), …)
ところで、DIの理解を深めようとする人には、DhanjiPrasannaによる「依存性注入」を強くお勧めします。GuiceとSpringに焦点を当てたこの本は、私が出会った他のどの本よりもはるかに深いので、絶対に不可欠でした。
ご協力いただきありがとうございます!