20

同じライブラリを共有する 2 つのアプリケーションがあるとします。このライブラリには、DAO、Utils などの一般的なクラスが含まれています。共有ライブラリ内のすべてが Guice で接続されています。私の 2 つのアプリはこのライブラリに依存していますが、Guice に直接依存していません。

 ______    ______    ______
|      |  |      |  |      |
| APP1 |->| LIB  |<-| APP2 |
'------'  '------'  '------'

私は現在、次のようなものを使用しています:

static <T> Utils.getInstanceOf (Class<T> type);

これは単に次のラッパーです。

injector.getInstance (Class<T> type);

しかし、guice ドキュメントには次のように書かれています。

可能な場合は、この方法の使用を避け、事前に Guice が依存関係を挿入するようにしてください。

では、Guice モジュールで手動でバインドせずに 2 つのアプリに依存性注入を提供する最善の方法は何でしょうか?

4

5 に答える 5

15

では、Guice モジュールで手動でバインドせずに 2 つのアプリに依存性注入を提供する最善の方法は何でしょうか?

そのような方法はありません。Guice を完全に採用するか、Guice を使用せずに依存関係を明示的に渡します。クラスの依存関係を直接作成せず、代わりにコンストラクターを介して渡すような方法でコードを構造化することも、「依存関係の注入」と呼ばれる可能性がありますが、これはあなたが意図したものではないと確信しています。アプリで Guice を使用したくない場合は、特に静的ラッパーgetInstance()を使用しているため、醜いよりも優れたものを取得することはできません。

理想的には、ライブラリは、アプリケーションにインストールできるモジュールを提供する必要があります。Guice.createInjector()逆に、ライブラリは、アプリケーション固有のモジュールInjectorを使用および提供することにより、アプリケーションで使用できるインスタンスを提供する必要があります。createChildInjector()このアプローチをわずかに変更して、アプリケーション固有のモジュールをライブラリに渡し、それらが の作成に使用されるようにしますInjector。私は最近、最後のアプローチを使用してあらゆる種類の DI をまったくサポートしていないカスタム サーブレットのようなインターフェイスを介して Guice ベースの API を作成しましたが、完全に機能しています。

サーブレットまたはジャージー環境で Guice を使用することはまったく難しくありません。たとえば、後者はすぐに使用できる Guice との統合を備えています (少なくとも 1.x バージョンでは)。Guiceサーブレット拡張機能も非常に優れていて便利です。試してみて、自分の目で確かめてください。

于 2013-10-11T07:04:29.223 に答える
4

static <T> Utils.getInstanceOf (Class<T> type);

あなたが最終的に得たのはService Locatorです。

いくつかの小さなケースでは、これは がinjector他の創造物に逃げることは許容されますが、私はこれがそれらの 1 つではないと思います。Service Locator のすべての欠点を抱えてしまいましたが、既に使用しているツールを使用することですべての利点を得ることができます。

于 2013-10-11T09:43:58.353 に答える
2

インジェクターを使用する「通常の」パターンは、プロジェクトの最上位のエントリ ポイントに設定することです (サーブレット シナリオでは、Guice-Servlet を使用し、これは GuiceServletContextListener になります)。モジュール化のために、いくつかの依存関係へのエントリポイントで個々のインジェクターを構成し、その依存関係を配線する責任を負わせたい場合があります。個々のバインディングと親プロジェクトからのバインディングの両方が必要な場合は、依存関係で、バインディングが見つからない場合に親に委任する子インジェクターを作成できます。Guice はこれをサポートします。

ただし、依存関係内にインジェクターをセットアップし、それをメインアプリで使用したいのは奇妙に思えます。これは、依存関係がメイン アプリに必要なすべてのバインディングを認識していることを意味します。このアプローチで何を達成しようとしているのかよくわかりません。2 つのアプリのバインド設定が同じ/非常に似ていて、それを繰り返したくないということですか? この場合、すべてのバインディング構成を含むモジュールを 1 回 (おそらく依存関係で) 定義し、各アプリのエントリ ポイントでインジェクターをセットアップするときにそれを使用する必要があります。あなたのシナリオに関してはそれだけです。

一般的にあなたの質問に。インジェクターを明示的に渡さないようにすることをお勧めします。これを行うときはいつでも、透過的なプロジェクトであるという依存性注入の考えに反対し、具体的な注入フレームワークに縛られます。ほとんどの場合、ProvidersFactoryを使用することで、インジェクターへの明示的な参照を回避できます。

于 2013-10-11T07:53:28.823 に答える
0

ええ、この方法でインジェクターを渡しても問題ありません。

ウィケット アプリケーションでも同様のことを行ったので、ウィケット以外のページについては、単純に使用injector.get.inject(this)してコンストラクターに渡しました。

そしてそれは完璧に機能します。

お役に立てれば。

于 2013-10-11T07:20:24.870 に答える