【问题标题】:Guice, bind different database provider based on yaml configGuice,基于 yaml 配置绑定不同的数据库提供程序
【发布时间】:2009-12-02 14:56:00
【问题描述】:

我有一个如下所示的应用程序配置文件:

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

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

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

我该如何解决?

【问题讨论】:

    标签: hibernate guice


    【解决方案1】:

    我找到了一种方法来做到这一点。这可能不是最好的方法,所以如果你知道得更好,我还是会看看答案。

    关键是,binder 确实首先必须完全配置,因此它可以提供 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();
            }
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 2017-03-27
      • 2023-03-04
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多