我们说我有一个ThirPartyModule
第三方模块,它绑定了许多我可以在我的应用程序中使用的组件:
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule());
如果我想修改用于该模块中某些绑定的实现类,那么最佳方法是什么?
例如,让我们说ThirPartyModule
执行该绑定:
bind(WidgetInterface.class).to(DefaultWidgeImpl.class).in(Scopes.SINGLETON);
我希望能够更改DefaultWidgeImpl
课程的MyWidgetImpl
课程。我知道我可以使用覆盖模块,只需重新绑定WidgetInterface
密钥。但是如果ThirPartyModule
使用相同的 Widget实现绑定 很多 的内容会怎样?我可能不想重新绑定它们!
所以我试图找到能够指定要使用的实现类的最佳解决方案,而不必根据它重新绑定所有组件。
我猜ThirPartyModule
可以先为实现类创建一个getter方法:
bind(WidgetInterface.class).to(getWidgetImpClass()).in(Scopes.SINGLETON);
protected Class<? extends WidgetInterface> getWidgetImpClass() {
return DefaultWidgeImpl.class;
}
然后应用程序可以覆盖getWidgetImpClass()
方法:
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule() {
@Override
protected Class<? extends WidgetInterface> getWidgetImpClass() {
return MyWidgetImpl.class;
}
});
我还想将实现类传递给Module的构造函数:
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule(MyWidgetImpl.class));
我想知道是否有可接受的模式来定制此类第三方模块?假设我可以要求模块以特定方式编写,如果它可以帮助它们进行自定义。
答案 0 :(得分:2)
我将如何做到这一点:
public class ThirdPartyModule extends AbstractModule {
@Override
protected void configure() {
// CoolWidget --
// \
// > WidgetInterface -> DefaultWidgetImpl
// /
// AwesomeWidget
OptionalBinder.newOptionalBinder(binder(), WidgetInterface.class)
.setDefault()
.to(DefaultWidgetImpl.class);
bind(CoolWidget.class).to(WidgetInterface.class);
bind(AwesomeWidget.class).to(WidgetInterface.class);
// etc.
}
}
public class MyAppModule extends AbstractModule {
@Override
protected void configure() {
OptionalBinder.newOptionalBinder(binder(), WidgetInterface.class)
.setBinding()
.to(CustomWidgetImpl.class);
}
}
通过WidgetInterface
键间接进行所有绑定,您只需要覆盖那一个绑定。