我有一个类似于这样的应用程序配置文件:
database:
type: [db-type]
username: [name]
password: [pw]
server: [ip]
database: [db-name]
db-type可以是以下任何一种:{postgresql,mysql,mssql,file}。 我想配置绑定,这样(它是基于hibernate的)应用程序根据使用的值加载一个特殊的SessionFactory提供者,即PostgresqlSessionFactoryProvider。
问题是,Guice还负责将Config.class实例注入需要访问它的类中。现在我需要访问配置,同时设置绑定......这有点鸡蛋问题。
我如何解决这个问题?
答案 0 :(得分:1)
我找到了一种方法。这可能不是最好的方法,所以如果你知道的更好,我仍然会看到答案。
关键是,首先必须完全配置绑定器,因此它可以提供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();
}
}
}
你怎么看?这是一个很好的方法吗?