类ShinyCoinProvider
和RustyCoinProvider
都会实现Provider<Coin>
,每个类都会生成一个属性略有不同的Coin
对象。
另一组两个客户端类RichPlayer
和PoorPlayer
需要一个由Guice库自动注入的Coin
实例。
现在,Guice必须在ShinyCoinProvider
中使用Richplayer
,在RustyCoinProvider
类中使用PoorPlayer
。
因此很简单,bind().toProvider()
在这里是不够的。
如何明确地将不同的提供程序绑定到不同的客户端类,其中提供的Object具有相同的类型?
答案 0 :(得分:2)
试试这个:
bind(Coin.class).annotatedWith(Names.named("richplayer")).toProvider(ShinyCoinProvider.class)
使用@Named(“richplayer”)的Richplayer中的和注释Coin字段如下:
@Inject
@Named("richplayer")
private Coin coin;
答案 1 :(得分:2)
turtledove 的答案被称为带注释的绑定,如果您拥有对RichPlayer和PoorPlayer的控制权,那将非常有意义。它还可以让您从同一级别请求闪亮的硬币和生锈的硬币。但是,如果您愿意,也可以使用private modules。
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>
。