我遇到了覆盖PrivateModule绑定的问题。 这是我的示例项目:
所以我有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
中定义的绑定?
答案 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
模块的超类。