机器人腿PrivateModule和绑定覆盖

时间:2014-01-22 11:37:02

标签: java guice

我遇到了覆盖PrivateModule绑定的问题。 这是我的示例项目:

http://pastebin.com/3BxUT90H

所以我有3辆汽车,每辆汽车都从CommonModule获得变速箱和发动机。

我使用注释将Driveline分别绑定到每辆车,因此每个车都有不同的等级。 所以标准的机器人腿问题/解决方案。

但现在假设我有10辆不同的车,我想在一个模块中改变引擎。 我可以从CommonModule抛出Engine并在所有10个模块中定义Engine。 但更好的解决方案是在一个类中覆盖Engine绑定。

我怎样才能实现这个目标?

如果我在Module3中bind(Engine.class).to(PetrolEngine.class);,我自然会得到一个绑定到引擎已经配置了。

这就是为什么我们有Modules.override。

但是

 Injector injector = Guice.createInjector(
                commonModule,
                module1,
                module2,
                Modules.override(commonModule).with(module3)
        );

给了我同样的错误。

那么有没有办法定义PrivateModule并覆盖AbstractModule中定义的绑定?

1 个答案:

答案 0 :(得分:0)

将CommonModule作为参数传递给Guice.createInjector()方法,您可以在每个ModuleN模块中明确安装它。

所以Module3定义看起来像

class Module3 extends PrivateModule {
   @Override
   protected void configure() {
      install(new CommonModule());
      bind(Car.class).annotatedWith(Green.class).to(Car.class);
      expose(Car.class).annotatedWith(Green.class);
      bind(Driveline.class).to(FourWheelDrive.class);
   }
}

然后你可以指定一个只为引擎添加绑定的模块

class PetrolEngineModule extends AbstractModule {
   @Override
   protected void configure() {
      bind(Engine.class).to(PetrolEngine.class);
   }
}

Modules.override()应该有效:

Modules.override(module3).with(new PetrolEngineModule())

为避免在每个已定义的模块中调用install,您可以创建抽象超类AbstractCarModule。将install()放在该模块中,并将其用作每个ModuleN模块的超类。