Frage

Ich habe eine Anwendung config-Datei, die etwa wie folgt aussieht:

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

db-Typ kann eine der folgenden sein: {PostgreSQL, MySQL, MSSQL, file}. Ich wollte die Bindung, so dass (es ist Hibernate basiert) die App lädt einen speziellen Provider von Session konfigurieren, je nachdem, welche der Werte verwendet wird, das heißt ein PostgresqlSessionFactoryProvider.

Das Problem ist, dass Guice kümmert sich auch um eine Instanz von Config.class in Klassen der Injektion, die Zugriff auf diese benötigen. Jetzt muss ich die Config zugreifen, beim Einrichten der Bindung ... Es ist irgendwie ein Huhn-Ei-Problem.

Wie komme ich um das?

War es hilfreich?

Lösung

Ich habe einen Weg, dies zu tun gefunden. Es ist vielleicht nicht der beste Weg, es zu tun, wenn Sie also wissen es besser, ich werde noch auf den Antworten suchen.

Der Punkt ist, dass das Bindemittel zuerst vollständig konfiguriert werden muss, so kann er eine Instanz Config.class liefern.

Also habe ich mit einem benutzerdefinierten Provider für SessionFactory.class kam, die eine Konfiguration benötigt und der guice Injektor selbst, so dass, wenn alle Informationen von guice geschlürft wurden, sie über die Mittel zur Verfügung zu stellen eine andere Implementierung basiert auf der Config.

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

Was denken Sie? Ist das ein guter Weg, dies zu tun?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top