Как внедрить свойство из другого модуля в конструктор модуля? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть набор модулей, и меня интересует, как я могу получить доступ к привязкам другого модуля во время создания модуля.

Я знаю, что можно сделать requireBinding во втором модуле иполучить доступ к строке оттуда.Но это не тот интерфейс, который я получаю от внешней зависимости и, следовательно, не подлежит изменению.

Единственная альтернатива, которую я вижу, - это последовательно передавать ее всем модулям для обеспечения равного доступа.

См. Пример ниже:

package com.amazon.nlgeysercontrolplane.guice;

import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import org.junit.Test;

import static com.google.inject.Guice.createInjector;

public class MultiModuleTest {
    static class ChildModule2 extends AbstractModule {
        String f;
        public ChildModule2(final String f) { this.f = f; }
        protected void configure() { }
    }
    static class ChildModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(String.class).toInstance("foobar");
        }
    }

    @Test
    public void testGuiceModules() {
        Injector inj = createInjector(new AbstractModule(){
            @Override
            protected void configure() {
                install(new ChildModule());
                String f = binder().getProvider(String.class).get();
                install(new ChildModule2(f));
            }
        });
    }
}

Это исключение, которое я получаю (это согласуется с документацией).

Caused by: java.lang.IllegalStateException: This Provider cannot be used until the Injector has been created.
at com.google.common.base.Preconditions.checkState(Preconditions.java:173)
at com.google.inject.spi.ProviderLookup$1.get(ProviderLookup.java:102)
at com.google.inject.AbstractModule.configure(AbstractModule.java:62)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:340)
at com.google.inject.spi.Elements.getElements(Elements.java:110)
at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:138)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:104)
    0.016
...