5

Guiceを使用して小さなWebフレームワークを開発しています。初期化されると、getControllerClasses()メソッドを公開するRouterオブジェクトがあります。Guiceを使用してそれらをbind()するには、動的に返されたすべてのクラスをループする必要があります。

ルーターをバインドします:

bind(IRouter.class).to(Router.class);

しかし、モジュールでバインドされたルーターインスタンスを取得するにはどうすればよいのでしょうか。そのため、getControllerClasses()メソッドによって返されるクラスをバインドすることもできます。

モジュールでルーターインスタンスを取得できる唯一の方法は、このインスタンスを最初のモジュールでバインドしてから、セッターで@Injectを使用して2番目のモジュールに注入することです。

モジュール1

bind(IRouter.class).to(Router.class);

Module2 module2 = Module2();
requestInjection(module2);
install(module2); 

モジュール2

@Inject
public void setRouter(IRouter router)
{
    Set<Class<?>> controllerClasses = router.getControllerClasses();
    for(Class<?> controllerClass : controllerClasses)
    {
        bind(controllerClass);
    }
}

メソッドが呼び出され、Routerインスタンスは適切に初期化されますが、コントローラークラスのバインドは失敗します。Guiceライフサイクルのこのステップでは、module2のバインダーインスタンスがNULLのようです。

動的に取得されたクラスをバインドするにはどうすればよいですか?それらのクラスは、すでにバインドされているオブジェクトによって返されますか?

4

1 に答える 1

10

Guice は configure() を呼び出す前にバインダーを設定するため、その時点で Binder は null です。Module の configure() メソッドを呼び出す Guice 以外には、バインダーはありません。は単なるModuleコンフィギュレーション ファイルであり、ファイルInjectorを作成したときに がどのように動作するかを設定することに注意してください。

requestInjectionつまり、渡したインスタンスのフィールドをすぐにバインドしません。代わりに、誰かがInjector. Injector が作成されるまで、渡されたインスタンスには何も注入されません。

Router に Guice を必要とする依存関係がない場合は、 を作成し、new Router()それをコンストラクタ パラメータとしてモジュールに渡します。次に、制御クラスをループしてバインドし、bind(Router.class).toInstance(myRouter);.

ただし、 Router が他のモジュールに依存している場合は、子 Injectorを使用できます。まず、Injector を作成し、そこから Router インスタンスを取得してから、その Router インスタンスを、その制御クラスをバインドする別の Module に渡します。突然、モジュール (controllerClassesModule と呼びましょう) が作成され、次のことが可能になります。

newInjector = originalInjector.createChildInjector(controllingClassesModule);

次に、あなたnewInjectorのバインディングを継承originalInjectorし、ルーターが指定するすべての制御クラスも継承します。

それが役立つことを願っています!

于 2012-10-08T01:17:48.887 に答える