>类ShinyCoinProvider
和RustyCoinProvider
都实现了Provider<Coin>
,并且每个类都生成一个属性略有不同的Coin
对象。
另一组两个客户端类RichPlayer
和PoorPlayer
需要 Guice 库自动注入的Coin
实例。
现在,Guice 需要在Richplayer
中使用ShinyCoinProvider
,在PoorPlayer
类中使用RustyCoinProvider
。
因此很简单,bind().toProvider()
在这里是不够的。
如何将不同的提供程序显式绑定到不同的客户端类,其中提供的对象是相同的类型?
turtledove 的答案称为注释绑定,如果你可以控制你的 RichPlayer 和 PoorPlayer,这很有意义。它还使您能够从同一类请求闪亮的硬币和生锈的硬币。但是,如果需要,也可以使用私有模块。
class CoinModule extends AbstractModule {
@Override public void configure() {
install(new PrivateModule() {
@Override public void configure() {
bind(Coin.class).toProvider(ShinyCoinProvider.class);
bind(RichPlayer.class);
expose(RichPlayer.class);
}
});
install(new PrivateModule() {
@Override public void configure() {
bind(Coin.class).toProvider(RustyCoinProvider.class);
bind(PoorPlayer.class);
expose(PoorPlayer.class);
}
});
}
}
基本上,这会安装两个匿名的内部模块,每个模块绑定不同的播放器,因此即使没有注释,RichPlayer和RichPlayer的任何依赖项,以及其依赖项的任何依赖项等都将使用ShinyCoinProvider。PoorPlayer和RustyCoinProvider也是如此。这可能比带注释的绑定更难遵循,但也更强大一些 - 也许从这里你可以减少RichPlayer和PoorPlayer使用相同的具体类,或者创建一个两个播放器实现都使用的CoinPurse类,它只是注入Provider<Coin>
。
试试这个:
bind(Coin.class).annotatedWith(Names.named("richplayer")).toProvider(ShinyCoinProvider.class)
并在 Richplayer 中使用 @Named("richplayer")注释 Coin 字段,如下所示:
@Inject
@Named("richplayer")
private Coin coin;