2009-12-02 9 views
0

У меня есть конфигурационный файл приложения, который выглядит примерно так:Guice, связать другого поставщика базы данных на основе YAML конфигурации

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

дб типа может быть любой из следующих: {PostgreSQL, MySQL, MSSQL, файл }. Я хотел настроить привязку, так что (она основана на спящем режиме) приложение загружает специальный поставщик SessionFactory в зависимости от того, какое из значений используется, т. Е. PostgresqlSessionFactoryProvider.

Проблема заключается в том, что Guice также заботится о введении экземпляра Config.class в классы, которым необходим доступ к нему. Теперь мне нужно получить доступ к конфигу, установив привязку ... Это своего рода проблема с куриным яйцом.

Как мне обойти это?

ответ

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

Как вы думаете? Это хороший способ сделать это?

+0

Ну. Если никто не знает, или никто не заботится, я должен принять свой собственный ответ ... – kungfoo

Смежные вопросы