0

我有一个看起来像这样的应用程序配置文件:

database:
  type: [db-type]
  username: [name]
  password: [pw]
  server: [ip]
  database: [db-name]

db-type 可以是以下任何一种:{postgresql, mysql, mssql, file}。我想配置绑定,这样(它是基于休眠的)应用程序根据使用的值加载一个特殊的 SessionFactory 提供程序,即 PostgresqlSessionFactoryProvider。

问题是,Guice 还负责将 Config.class 的实例注入到需要访问它的类中。现在我需要访问配置,同时设置绑定......这是一个鸡蛋问题。

我该如何解决?

4

1 回答 1

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();
        }
    }
}

你怎么看?这是一个好方法吗?

于 2009-12-03T10:04:01.013 回答