5

あなたのアドバイスは何ですか?

私は自分の解決策に最も適していると感じました-インジェクターとモジュールを列挙型クラスに保持します。利点:

  1. 一度作成されたインジェクターとモジュール、
  2. インジェクターは、アプリケーションの実行中に(ブートストラップ時だけでなく)さまざまなクラスから使用できます。
  3. インジェクターは一か所に保管されており、簡単に見つけることができます。

例:

import static ru.package.Modules.*;

public enum Injectors {

FOO_INJECTOR(BarModule.module()),

FOO2_INJECTOR(FOO_INJECTOR.injector(),
        Bar2Module.module(), FooModule.module());

private final Injector m_injector;

Injectors (Module... modules) {
    m_injector = Guice.createInjector(modules);
}

Injectors (Injector parentInjector, Module... modules) {
    m_injector = parentInjector.createChildInjector(modules);
}

public Injector injector() {
    return m_injector;
}
}
4

2 に答える 2

17

依存性注入の仕組みを根本的に誤解しているようです。Injectorアプリケーションをブートストラップする場所以外のコード内の任意の場所への参照を使用しようとしている場合は、依存性注入を使用していません。代わりにサービス ロケーターとして使用しています。クラスをテストする必要があるときはいつでもを準備するInjector必要があり、クラスはコンストラクターで依存関係が正確に何であるかを明確にしていません (なぜならInjector、あるメソッドで を持っているか、できる場合に何を取得できるかを誰が知っているからです)それへの参照を取得します)。実際、enumここで説明したように使用することは、それよりもさらに悪いことです。モジュールが列挙型にハードコードされているため、テストであっても構成をまったく変更できません。

依存性注入を使用すると、クラスは依存性のみを宣言し、Injector(ルート アプリケーション オブジェクトを取得するための最初の呼び出しの後) 透過的に動作する がそれらすべての依存性を提供できるようにします。これにより、コード内の機能の理解、テスト、および変更が比較的簡単になります。とにかく、DI と Guice がどのように使用されることを意図しているかについてもっと学ぶことをお勧めします...あなたは本当にこれをしたくないはずです.

于 2010-02-01T14:53:55.707 に答える
6

より大きな問題は、なぜですか?

注射が完了すると、注射が行われ、消えるはずなInjectorので、周りを保つ必要はありません。Injector

ただし、本当に必要な場合は、次のInjectorように簡単にできませんでした:

@Inject
private Injector injector;

このアプリケーションは Web ベースですか、それともスタンドアロンですか?

于 2010-02-01T11:51:05.660 に答える