2

多くの場合、クラスをインスタンス化 (構築) してから、使用する前に「配線」 (構成) する必要があります。例えば:

// Construction.
EventBus bus = new EventBus();
FizzEventHandler fizzHandler = new FizzHandler();
BuzzEventHandler buzzHandler = new BuzzHandler();

// Wiring.
bus.register(fizzHandler);
bus.register(buzzHandler);

Guice では、最初の部分 (構築; 挿入) を次のように実行しますBinder

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bind(EventBus.class).to(SimpleEventBus.class);
        bind(FizzEventHandler.class).to(DefaultFizzEventHandler.class);
        bind(BuzzEventHandler.class).to(DefaultBuzzEventHandler.class);
    }
}

しかし、配線はどこで行われますか?私の Guice ベースのアプリが起動すると、DI の「ブートストラップ」プロセスが実行されます。

public class MyApp {
    private EventBus bus;
    private FizzEventHandler fizzHandler;
    // ...etc.

    public static void main(String[] args) {
        MyApp app = new MyApp();
        app.run();
    }

    public MyApp() {
        // Bootstrap DI.
        MyModule myModule = new MyModule();
        Injector injector = Guice.createInjector(myModule);

        bus = injector.inject(EventBus.class);
        fizzHandler = injector.inject(FizzEventHandler.class);
        // ...etc.

        // Wire
        bus.register(fizzHandler);
    }
}

これは、最上位 (ルート) DI クラスでは問題なく機能します。しかし、依存関係ツリーをさらに「下」に進み、アプリケーションで使用される他のすべてのオブジェクトに入ると、このように配線ロジックをコンストラクターに配置するのは見苦しく、(私は信じています) 推奨されない方法です。

だから私は尋ねます:戦いに疲れたGuiceのベテランはどこに配線/設定コードを置きますか?

4

3 に答える 3

3

私は、Guice を使用するかなり大きなシステム (~3000 クラス) に取り組んでいます。私たちのアプローチは、コンストラクターですべてを行うことです。あなたが説明するように、明確な「建設」と「配線」の活動はありません。建設だけがあります。

あなたの例では、イベントハンドラーはバスへのコンストラクターパラメーターになり、コンストラクターに登録されます。

特定のタイプのすべてのコンポーネントをかなり柔軟に注入したい場合 (ここでは、すべてのイベント リスナーをバスに注入したい場合)、multibindingsを使用できます。ただし、コードベースで実際にこれを使用しているとは思いません。注入が必要なすべてのリストを手動で書き出すだけですが、実際にはそれほど難しいことではありません。

于 2013-02-02T15:50:40.970 に答える
2

私は通常、論理関数で区切られた複数のモジュールを使用します。したがって、あるモジュールには認証が含まれ、別のモジュールにはデータ リポジトリがあり、別のモジュールには私が使用しているメッセージング システムなどがあります。これにより、V のモック、キャッシュ用にさまざまなモジュールを使用できます。非キャッシュ、または同じサービスの単に異なる実装であり、依存関係のチャンクをすばやく簡単に切り替えることができます。

物事をさらに柔軟にするために、インジェクターの起動時に使用する必要があるモジュールを宣言する構成ファイルを持つことができます。

于 2013-02-02T13:46:50.833 に答える