Как получить уже установленный MapBinder, чтобы добавить в него дополнительные привязки - PullRequest
0 голосов
/ 24 апреля 2019

Я использую com.google.inject:guice.В моем проекте я включил зависимость, у которой есть модуль (класс, который расширяет com.google.inject.AbstractModule), который определяет MapBinder как этот

public class ParentGuiceModule extends AbstractModule {    
    @Override
    protected void configure() {
        MapBinder.newMapBinder(binder(), TypeLiteral.get(String.class), TypeLiteral.get(SomeModuleClass.class));
        ...
    }
}

В моем классе модуля я хочу получить это MapBinder и добавьте новые привязки к нему.Я хочу написать что-то вроде этого:

public class MyGuiceModule extends AbstractModule {    
    @Override
    protected void configure() {
        MapBinder<String, SomeModuleClass> parentModules = MapBinder.get(binder(), TypeLiteral.get(String.class), TypeLiteral.get(SomeModuleClass.class));
        parentModules.addBinding("MyId").to(MyClass.class);
    }
}    

Как я могу это сделать?Я не могу изменить родительский модуль.

Я изучил класс MapBinder, кажется, у него нет никаких методов для установки уже установленного MapBinder.

1 Ответ

1 голос
/ 26 апреля 2019

Это именно то, для чего предназначен MapBinder - в конце концов, если бы вы знали все, что должно было быть внутри MapBinder из одного модуля, вы могли бы просто написать @Provides Map<Foo, Bar> или bind(new TypeLiteral<Map<Foo, Bar>>(){}) и покончить с этим.

Из документов верхнего уровня MapBinder :

Поддерживается добавление привязок из разных модулей. Например, нормально, чтобы и CandyModule, и ChipsModule создавали свои собственные MapBinder<String, Snack>, и каждый из них вносил привязки в карту закусок. Когда эта карта введена, она будет содержать записи из обоих модулей.

Не обескураживайтесь именем newMapBinder: если у вас точно такие же параметры для newMapBinder и оба ваших модуля установлены в одном и том же инжекторе, вы получите одну карту с привязками из обоих модулей.

...