Квалификатор, охватывающий совокупное дерево - PullRequest
2 голосов
/ 10 февраля 2020

Я хотел бы создать несколько экземпляров bean-компонента CDI и далее вниз по дереву агрегирования выбрать реализацию интерфейса в зависимости от квалификатора.

В следующем примере я создаю два экземпляра Controller с квалификатором. Контроллер является частью базовой библиотеки, которая в нашем случае содержит несколько классов. Я хотел бы иметь возможность выбирать разные реализации Repository для двух разных контроллеров в зависимости от спецификатора.

Я мог бы создать @Producer для выбора между двумя реализациями Repository, но я не могу понять, как определить, какой экземпляр вернуть. У меня нет доступа к квалификатору, указанному в точке внедрения Контроллера, а только в точке внедрения Репозитория.

В настоящее время у нас есть две реализации Репозитория, живущие в разных войнах с зависимостью от ядра lib, что решило проблема, но я хотел бы иметь возможность изменить это.

Приложение

class MyApplication {
    @Inject
    @Component("comp1")
    Controller controller1;

    @Inject
    @Component("comp2")
    Controller controller2;
}

@Component("comp1")
public class Comp1Repository implements Repository {

}

@Component("comp2")
public class Comp2Repository implements Repository {

}

Базовая библиотека

public interface Repository {

}

public class Controller {
    @Inject
    Repository repository;
}

1 Ответ

0 голосов
/ 10 февраля 2020

Я думаю Я понимаю, что вы хотите. Будет ли это работать?

@Produces
@Component("comp1")
@Dependent // or whatever scope you need
private Controller makeAppropriateController(@Component("comp1") final Repository comp1Repository) {
  return makeController(comp1Repository); // however you do it
}

@Produces
@Component("comp2")
@Dependent // or whatever scope you need
private Controller makeAppropriateController(@Component("comp2") final Repository comp2Repository) {
  return makeController(comp2Repository); // however you do it
}
...