5

我正在使用 Guice 开发一个小型 Web 框架。我有一个Router对象,一旦初始化,就会公开一个getControllerClasses()方法。我必须遍历所有这些动态返回的类以使用 Guice 绑定()它们。

我绑定路由器:

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

但是,我怎样才能在一个模块中获得绑定的路由器实例,所以我也可以绑定它的getControllerClasses()方法返回的类?

我能够在模块中获取路由器实例的唯一方法是将此实例绑定到第一个模块中,然后将其注入第二个模块中,在 setter 上使用 @Inject :

模块 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 的binder实例似乎为 NULL。

如何绑定动态获取的类,这些类已由已绑定的对象返回?

4

1 回答 1

10

此时 Binder 为空,因为 Guice 在调用 configure() 之前设置了 binder。在 Guice 调用模块的 configure() 方法之外,没有活页夹。请记住,aModule只是一个配置文件,它配置了Injector您创建文件时的行为方式。

requestInjection它的行为不像你想象的那样——也就是说,它不会立即绑定你传入的实例的字段。相反,你告诉它在有人创建Injector. 在创建 Injector 之前,不会将任何内容注入到传递的实例中。

如果您的路由器没有需要 Guice 的依赖项,则只需创建一个new Router()并将其作为构造函数参数传递给您的模块。然后你可以遍历你的控制类并绑定它们,还有bind(Router.class).toInstance(myRouter);.

但是,如果您的 Router 确实依赖于其他模块,那么您可以使用子 Injector。首先,创建一个 Injector,从中获取一个 Router 实例,然后将该 Router 实例传递给绑定其控制类的另一个 Module。突然之间,您将拥有一个模块(我们称之为 controlClassesModule),您可以执行以下操作:

newInjector = originalInjector.createChildInjector(controllingClassesModule);

然后,您newInjector将从您的绑定originalInjector以及路由器指定的所有控制类继承绑定。

希望有帮助!

于 2012-10-08T01:17:48.887 回答