2

以下に説明する構造を持つシステムの依存性注入を構築するための最良の方法について、いくつかの提案とフィードバックをお願いします。私は Guice を使用しているため、XML を多用する Spring スタイルの構成ではなく、注釈ベースの宣言を中心としたソリューションを好むでしょう。

コンストラクターを介して提供されるBall, Box, and Tube、それぞれが に依存する一連の同様のオブジェクト を考えてみましょう。Logger(これは重要ではないかもしれませんが、4 つのクラスはすべてたまたま、Gang-of-Four ではなくアプリケーションのシングルトンです。)

クラスは、3 つの形状オブジェクトのToyChest作成と管理を担当します。 である形状オブジェクトを作成することを除けば、ToyChestそれ自体は に依存していません。Logger

クラスは、クラスToyChest内のアプリケーション シングルトンとしてインスタンス化されますMain

で形状を構築する最良の方法について混乱していToyChestます。(1) 実装へのバインディングに既にアタッチされている GuiceInjectorインスタンスにアクセスする必要があるか、(2) right にアタッチされた新しいインスタンスを作成する必要があります。ModuleLoggerInjectorModule

@Inject Injector injector(1) は にフィールドを追加することによって実現されますが、実際には直接的な依存関係がないToyChestため、これは奇妙に感じます。インスタンス化する子の依存関係のみです。ToyChest

(2) については、適切な を渡す方法がわかりませんModule

私は正しい軌道に乗っていますか?これを構造化するより良い方法はありますか?

この質問への回答に、インジェクターを直接使用する代わりに a を渡すことが記載されてProviderいますが、それがどのように機能するのかわかりません。

編集:

もっと単純な質問かもしれませんが、Guice を使用する場合、形状オブジェクトを構築する適切な場所はどこでしょうか? ToyChestそれらを使用していくつかの構成を行いますが、他の場所で構築できると思います。 ToyChest(それらを管理するコンテナーとして) ではなくMain、それらを構築するのに適切な場所のように思えます。

4

1 に答える 1

3

適切な方法は、guice に依存関係を構築させることです。つまり、作成して構成します。

あなたの状況では、Main. インジェクターから取得しますToyChest。インジェクターを介して取得ToyChestすると、guice によって管理され、適切に構成されたすべての依存関係を提供することができます。

あなたの場合Provider<Ball>Provider<Box>、 などを注入し、ToyChest必要に応じてプロバイダーからインスタンスを取得することができます。ToyChestインスタンスを構築する責任はなく、使用するだけです。プラグイン アーキテクチャがある場合は、MapBinderを確認することもできます。

これまでのところ、すべてが Guice によって管理されているため、使用しているクラスが認識していなくても、シェイプにロガーを注入できます。

新しく作成されたシェイプ インスタンスに渡したいランタイム パラメータがある場合は、AssistedInjectを使用できます。

ヒント: コンストラクター注入を使用する必要はありません。コンストラクターを簡素化するフィールドまたはセッターに注入することができます。

于 2011-11-23T22:02:29.693 に答える