Assisted Inject для внедрения различных зависимостей на основе проверки времени выполнения - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть класс приложения "Приложение", один абстрактный класс "AbstractClass", расширенный "Impl1" и "Impl2". Класс приложения получает impl1 или impl2 для выполнения некоторой задачи на основе получаемых им входных данных.

В настоящее время я внедряю оба класса в класс приложения, как показано ниже. Затем, основываясь на вводе, я либо спрашиваю impl1 ИЛИ impl2, чтобы выполнить задачу.

public class Application {

         private static final Data data1 = DATA_CONFIG.data_1;
         private final AbstractClass impl1;
         private final AbstractClass impl2;

         @Inject
         Application(final AbstractClass impl1, final AbstractClass impl2){
               this.impl1 = impl1;
               this.impl2 = impl2;
         }

         public void mainTask(final Data data){

               if(data == data1){
                    impl1.performTask();
               }else{
                    impl2.performTask();
               }
         }
}

Но есть ли способ, которым я мог бы использовать вспомогательный ввод или подобную концепцию для внедрения только требуемой зависимости, например, ввод data1 , я только внедряю impl1, а не impl2.??

1 Ответ

0 голосов
/ 11 марта 2020

Итак, вам нужно выбрать внедренный объект в зависимости от некоторого контекста точки внедрения - в частности, значения объекта Data. Я не делал таких вещей и не могу гарантировать успех, но вы можете попробовать специальные инъекции .

Также вы можете сделать что-то вроде factory . Но ИМХО, этот подход не намного лучше, чем оригинальный, потому что он просто переместит выбор между impl1 и impl2 в фабричный класс, который вы должны сначала создать.

Sketch:

@Inject
Application(IAbstractClassFactory factory){
    this.factory = factory
}

void mainTask(final Data data){
    impl = factory.create(data)
}
...