Ändern der Guice-Bindungen zur Laufzeit

Ich möchte in der Lage sein, die Guice-Injektionen zur Laufzeit zu ändern, um mehrere Injektionen basierend auf Benutzereingaben zu unterstützen. Das möchte ich erreichen:

public interface IDao {
    public int someMethod();
}

public class DaoEarth implements IDao {
    @Override
    public int someMethod(){ ... }
}

public class DaoMars implements IDao {
    @Override
    public int someMethod(){ ... }
}

public class MyClass {
    @Inject
    private IDao myDao;

    public int myMethod(String domain) {
        //If Domain == Earth, myDao should be of the type DaoEarth

        //If Domain == DaoMars, myDao should be of the type DaoMars
    }
}

Ich wollte meinen eigenen Provider schreiben, weiß aber nicht, wie ich diesen Provider verwenden soll, um meine Bindungen zur Laufzeit zu ändern. Jede Eingabe ist willkommen und geschätzt :)!

Aktualisieren Folgendes habe ich mir gerade ausgedacht: Es ist nicht so hübsch, wie ich es gerne hätte. Ich bin also immer noch auf der Suche nach Feedback

public class DomainProvider {
    @Inject @Earth
    private IDaoProvider earthDaoProvider;

    @Inject @Mars
    private IDaoProvider marsDaoProvider;

    public IDaoProvider get(Domain domain){
        switch (domain){
            case EARTH:
                return earthDaoProvider;
            case MARS:
                return marsDaoProvider;
        }
    }

    public IDaoProvider get(String domain){
        Domain parsedDomain = Domain.valueOf(domain.toUpperCase());
        return get(parsedDomain);
    }
}

//MarsDaoProvider would be equivalent
public class EarthDaoProvider implements IDaoProvider {
    @Inject @Earth
    private IDao earthDao;

    public IDao getDao() {
        return earthDao;
    }
}

This means that in "MyClass", I can do:
public class MyClass {
    @Inject
    private DomainProvider domainProvider;

    public int myMethod(String domain) {
        IDaoProvider daoProvider = domainProvider.get(domain);
        IDao dao = daoProvider.getDao();

        //Now "dao" will be of the correct type based on the domain
    }
}

//Of course elsewhere I have the bindings set like
bind(IDao.class).annotatedWith(Earth.class).to(EarthDao.class);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage