我正在寻找一种强制某些Guice绑定仅作为提供者注入的方法。例如,当存在类似
的配置时interface ResultLogger {
void log(String resultAsString);
}
class ResultLoggerProvider implements Provider<ResultLogger> {
// ...
}
class ResultDisplayModule extends AbstractModule {
@Override
protected void configure() {
bind(ResultLogger.class).toProvider(ResultLoggerProvider.class);
}
}
我想有办法配置我的模块,以便像
这样的类@Singleton
class ResultParser {
private final Provider<ResultLogger> loggerProvider;
@Inject
public ResultParser(Provider<ResultLogger> loggerProvider) {
this.loggerProvider = loggerProvider;
}
}
可以很好地注入,但是像
这样的实现@Singleton
class ResultParser {
private final ResultLogger resultLogger;
@Inject
public ResultParser(ResultLogger resultLogger) {
this.resultLogger = resultLogger;
}
}
应该抛出一个RuntimeException,通知开发人员ResultLogger
只能通过提供者使用。理想情况下会尽快抛出例外,例如:在喷射器的构造期间。我正在寻找一种使用Guice 3.0中现有API实现此目的的简单方法。
答案 0 :(得分:4)
也许你根本不应该实现Provider而只是有一个
@Singleton
public class ResultLoggerProvider {
public ResultLogger get() {...}
// ...
}
@Singleton
class ResultParser {
private final ResultLoggerProvider loggerProvider;
@Inject
public ResultParser(ResultLoggerProvider loggerProvider) {
this.loggerProvider = loggerProvider;
}
}
并删除其他绑定。
答案 1 :(得分:1)
我认为这不是正确的方法。我猜你需要像smt一样
interface ResultLogger {
void log(String resultAsString);
}
class ResultLoggerWrapper implements ResultLogger {
@Inject @Named("day") ResultLogger dayLogger;
@Inject @Named("night") ResultLogger nightLogger;
public void log(String resultAsString){
if(isDay()) {
dayLogger.log(resultAsString)
} else {
nightLogger.log(resultAsString)
}
}
}
bind(ResultLogger.class).to(ResultLoggerWrapper.class);
答案 2 :(得分:-1)
它应该可以绑定Provider而不是ResultLogger。那是在你的模块中
bind(new TypeLiteral<Provider<ResultLogger>>(){}).to(ResultLoggerProvider.class);