我找到了一种方法来做到这一点。这可能不是最好的方法,所以如果你知道得更好,我仍然会看答案。
关键是,绑定器首先必须完全配置,因此它可以提供 Config.class 的实例。
所以我想出了一个 SessionFactory.class 的自定义提供程序,它需要一个配置和guice 注入器本身,这样当所有信息都被 guice 吞下时,它就有办法根据配置提供不同的实现。
public class SessionFactoryProvider implements Provider<SessionFactory> {
private Config config;
private Injector injector;
@Inject
public SessionFactoryProvider(Config config, Injector injector) {
this.config = config;
this.injector = injector;
}
@Override
public SessionFactory get() {
switch (config.database.type) {
case postgresql:
return injector.getInstance(PostgresqlSessionFactoryProvider.class).get();
case mysql:
return injector.getInstance(MysqlSessionFactoryProvider.class).get();
case file:
return injector.getInstance(FileBasedSessionFactoryProvider.class).get();
/* some more providers... */
default:
return injector.getInstance(FileBasedSessionFactoryProvider.class).get();
}
}
}
你怎么看?这是一个好方法吗?