Guice Persist с несколькими единицами сохраняемости

У меня есть настройка с несколькими единицами сохранения, но проблема в том, что я предпочел бы иметь значение по умолчанию, а не явно объявлять одно или другое. Когда я захочу «другой», я прямо попрошу об этом. Когда я хочу использовать по умолчанию, я хочу сделать то же самое, как если бы у меня был только один PU.

Я попытался просто установить JpaPersistModule внутри PrivateModule, но это ничего не изменило. Если я привязываюсь к аннотации «по умолчанию» и пытаюсь выполнить повторную привязку без классификатора «annotatedWith», я получаю ошибку повторной привязки.

Это возможно? Я считаю, что с эквивалентом в CDI я могу ввести точку впрыска, чтобы посмотреть на нее и принять решение на месте. Мне еще предстоит найти эквивалент в guice, но он должен быть.

С точки зрения кода, это то, что у меня есть (но не хочу):

@Inject
public SomethingService(@Primary Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

Вместо этого я хочу это:

@Inject
public SomethingService(Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

person Walter    schedule 30.01.2019    source источник


Ответы (1)


Это очень похоже на то, что я пытался сделать с аннотациями @Named вместо аннотаций @Primary/@Secondary в Как связать динамическую привязку @Named

Я заставил его работать с Providers и PrivateModules; что-то вроде строк непроверенного следующего кода будет (я думаю) отражать настройку, которую я получил для работы, хотя потенциально все это может не понадобиться в вашем случае (и, возможно, ответ Джеффа на мой вопрос даст больше контекста) :

public class PrimaryRepositoryModule extends AbstractModule {
    @Provides
    public Repository provideRepository() {
         return new PrimaryRepository()
    }
}

public class SecondaryRepositoryModule extends AbstractModule {
    public void configure() {
        install(new PrivateSecondaryRepositoryModule())
    }
    private static class SecondaryProvider implements Provider<Repository> {
        public Repository get() {
            return new SecondaryRepository()
        }
    }
    private static class PrivateSecondaryModule extends PrivateModule {
        public void configure() {
            bind(Repository.class).annotatedWith(Secondary.class)
                .toProvider(SecondaryProvider.class)
            expose(Repository.class).annotatedWith(Secondary.class)
    }
}
person Joe    schedule 01.02.2019
comment
Спасибо - мне нужно проверить и посмотреть, смогу ли я заставить это работать с пользовательскими аннотациями., личные предпочтения :). - person Walter; 05.02.2019