10

モジュール内のいくつかのバインディングを再定義または更新して、インジェクターによって使用されることを望んでいます。モジュールは不変であり、バインディングが吸い込まれて注入されると、その定義はすべての実用的な目的で変更できるわけではないことを理解しています。

シングルトンをインジェクターに既に存在させたまま、バインディングを追加/変更/削除したいと思います。プロバイダーを使用することでこの効果を達成できるため、変更は単純なケースです。ただし、キー(バインディング定義)を動的に追加または削除するのは少し注意が必要です。

これが実際に行われるべきか、またはできるかどうかについての考え。

定義を元のシングルトンから新しいものにコピーして、追加/削除バインディングが発生するたびにインジェクターを再作成するのが最善の方法だと思います。既存のシングルトンは、実装タイプなどではなく、toInstanceによって再定義されます。

4

1 に答える 1

10

チャイルドインジェクターを使用してこれを実現できますが、いくつかの設定が必要です。チャイルドインジェクターは、長寿命のバインディングが短寿命のバインディングに依存するのを防ぎます。次に例を示します。

class ForeverModule extends AbstractModule {
  ...
}

class TemporaryModule extends AbstractModule {
  ...
}

class Main {
    public static void main(String... args) {
        Injector foreverInjector = Guice.createInjector(new ForeverModule());

        Injector injector = foreverInjector.createChildInjector(
                new TemporaryModule());
        /*
         * Do stuff with the injector as you would normally. When you
         * get bored of that injector, create a replacement injector
         * as a child of the long-lived injector.
         */
    }
}

foreverモジュールのシングルトンバインディングは、そのモジュールが存在する限り存続します。対応するインジェクターを使用している限り、一時モジュールのシングルトンバインディングは持続します。

警告:デフォルトでは、ジャストインタイムバインディングがトップレベルのインジェクターに作成されます。バインディングを短命にする必要がある場合は、インターフェイスと子インジェクターのモジュールの実装の両方をバインドする必要があります。これは次のようになります。

public void configure() {
    bind(Foo.class).to(RealFoo.class);
    bind(RealFoo.class);
}
于 2010-06-20T07:23:47.900 に答える