Получение объектов в графе объектов Guice - PullRequest
1 голос
/ 25 сентября 2011

Я пытаюсь сделать фасад для библиотеки, которую я отдаю. В моем фасаде я использую Guice для построения графа объекта. Глубоко в графе объектов находится объект Proxy с методами getURL / setURL. На моем фасаде, как мне получить экземпляр Proxy, используемый для создания моего корневого объекта? Я хочу, чтобы на моем фасаде были URL-геттеры и сеттеры.

Я пробовал что-то вроде этого:

public class SomeThingFacade() {

    private final SomeThing thing;
    private final HTTPProxy proxy;

    public SomeThingFacade() {
        MyModule module = new MyModule();
        Injector injector = Guice.createInjector(module);

        // this is the main class I'm making a facade for
        this.thing = injector.getInstance(SomeThing.class);

        // deep in the "thing" object graph is a Proxy implementation
        this.proxy = injector.getInstance(HTTPProxy.class);
    }


    public void setURL(URL url) {
        this.proxy.setURL(url);
    }
}

но injector.getInstance создал новый экземпляр.

Связывание в MyModule:

bind(Proxy.class).to(HTTPProxy.class).asEagerSingleton();

Я ранее жестко закодировал объектный граф в конструкторе фасада, но он оказался громоздким с 30 объектами.

По сути, мне нужно сконфигурировать экземпляр глубоко в графе объектов после создания, но я не уверен, как получить этот экземпляр.

1 Ответ

1 голос
/ 25 сентября 2011

Это выглядит как хороший серьезный вопрос. Однако я не могу точно понять, о чем идет речь.

Мой ответ, глядя на код и не обращая внимания на разговор об объектном графе (так что дайте мне знать, если я вас неправильно понял), таков:
Если thing SomeThing зависит где-то от deep internal proxy, модуль должен сконфигурировать его так, чтобы он был привязан к HTTPProxy. Второй getInstance не влияет на первый. Единственный способ сделать что-то, что proxy влияет на thing, - это если HTTPProxy был связан in(Singleton.class), то вызывая методы на прокси, которые влияют на членов и поведение HTTPProxy, которое также будет тем же экземпляром глубоко внутри thing вы можете делать то, что вы ищете. Я не понимаю, почему вы хотите сделать это таким образом. Попробуйте вместо этого написать провайдера, который настраивает HTTPProxy и / или создать специальный модуль только для использования фасада.

...