Инъекция зависимостей Guice, связывающая несколько классов с одним и тем же интерфейсом - PullRequest
0 голосов
/ 01 февраля 2019

Базовый интерфейс:

public interface Registry<E> {
    E method();
}

Реализация интерфейса:

RegistryImpl<E> implements Registry<E> {

    @Inject
    RegistryImpl(...) {
    }

    @Override
    public E method() {
         (...)
    }

}

Используется для привязки реестра для объекта данных A:

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface CustomDataObjectARegistry {
}

Используется для привязкиреестр для объекта данных B:

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface CustomDataObjectBRegistry {
}

Я хочу связать CustomDataObjectARegistry с RegistryImpl<DataObjectA> и CustomDataObjectBRegistry с RegistryImpl<DataObjectB>, но не смог выяснить синтаксис.

bind(CustomDataObjectARegistry.class).to(new TypeLiteral<RegistryImpl<DataObjectA>>() {})

дает мне «не может разрешить метод».

1 Ответ

0 голосов
/ 09 февраля 2019

Я думаю, что вы хотите сделать:

bind(new TypeLiteral<Registry<DataObjectA>>() {}).to(new TypeLiteral<RegistryImpl<DataObjectA>>() {})
bind(new TypeLiteral<Registry<DataObjectB>>() {}).to(new TypeLiteral<RegistryImpl<DataObjectB>>() {})

//and then inject with generics:
Registry<DataObjectA> registryA;
Registry<DataObjectB> registryB;

или:

bind(Registry.class).annotatedWith(CustomDataObjectARegistry.class).to(new TypeLiteral<RegistryImpl<DataObjectA>>() {})
bind(Registry.class).annotatedWith(CustomDataObjectBRegistry.class).to(new TypeLiteral<RegistryImpl<DataObjectB>>() {})

//and then inject with annotations:
@CustomDataObjectARegistry Registry registryA;
@CustomDataObjectBRegistry Registry registryB;

в основном вы можете использовать полную универсальную подпись для дифференциации, или вы можете использовать аннотации,но вам не нужно и то и другое.Я бы посоветовал дифференцировать с помощью дженериков.

...