Guice runtime dependency parameters reinjection

Вопрос о Guice. Я все еще изучаю его, но могу понять основы.

Этот вопрос уже задавался пару раз в сети, но так и не получил конкретного ответа (ни одного, который я смог найти).

Допустим, у меня ситуация как на картинке (похожий пример был где-то в сети).

enter image description here

public class Dog {}

public class Walk implements Walkable {
    private final Dog dog;
    private final boolean leash;

    @Inject
    public Walk(Dog dog, @Assisted boolean leash) {
        this.dog = dog;
        this.leash = leash;
    }

    public void go() {
    }
}

public interface Walkable {
    void go();
}

public interface WalkFactory {
    Walk create(boolean leash);
}

public class AssistedMain {
    public static void main(String[] args) {
        Injector i = Guice.createInjector(new AbstractModule() {
            protected void configure() {

                install(new FactoryModuleBuilder().
                        implement(Walkable.class, Walk.class).
                        build(WalkFactory.class));
            }
        });

        Walk walk = i.getInstance(WalkFactory.class).create(true);
    }
}

Это все замечательно. Но вопрос в том, могу ли я каким-то образом переинжектировать этот экземпляр объекта в "контейнер" (инжектор), чтобы использовать его в классах, которые зависят от этой зависимости.

Итак, добавим интерфейс Person, класс PersonImpl.

enter image description here

Источником новых классов являются:

public interface Person {
    void walkDog();
}

public class PersonImpl implements Person {
    private Walkable walkable;

    @Inject
    public PersonImpl(Walkable walkable) {
        this.walkable = walkable;
    }

    public void setWalkable(Walkable walkable) {
        this.walkable = walkable;
    }

    public void walkDog() {
        walkable.go();
    }
}

Итак, вопрос в том, смогу ли я каким-то образом внедрить этот конкретный экземпляр в добавленный объект. Это простой пример, но мы можем предположить, что существует 10 уровней классов ниже этого.

Решение, которое я нашел, не очень гибкое. Что-то вроде:

Injector i = Guice.createInjector(new SimpleModule(false, dog));

А затем привязка к конкретному экземпляру. Это не очень динамично. По сути, каждый раз, когда мне нужен другой параметр времени выполнения/динамический параметр, я должен заново создавать инжектор.

Provider - это хорошо, FactoryModuleBuilder помогает, но как я могу инжектировать объекты обратно?

Есть ли более динамичные решения этой проблемы?

Спасибо.

7
задан a_guest 8 November 2016 в 12:48
поделиться