es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Refactorización de la inyección de dependencias de 32 clases que extienden la misma clase abstracta utilizando Dagger.

Estoy trabajando en un proyecto con Vert.x que utiliza Dagger para la Inyección de Dependencias, y hay una clase que está creando un problema insostenible con la forma en que se realiza la inyección.

Esta es la clase que tengo:

public class ClassManager {
    private List<parentclass> all = new ArrayList<>();

    @Inject
    public ClassManager(ParentClass... classes) {
        if (classes != null) {
            all.addAll(Arrays.asList(classes));
        }
    }
    //otros métodos aquí abajo
}

El problema es que, en este momento, tenemos 32 clases que extienden de esta clase abstracta “ParentClass”, por lo que la inyección se realiza de la siguiente manera:

    @Provides
    @Singleton
    public ClassManager provideClassManager(SubClassA a, SubClassB b, SubClassC c.... y así sucesivamente) {
         return new ClassManager(a, b, c...y así sucesivamente);
    }

Hasta ahora no he encontrado una mejor solución sobre cómo hacer esta inyección con Dagger, pero necesito que esta “ClassManager” tenga acceso a todas las clases que extienden de “ParentClass”. ¿Existe alguna otra forma mejor? ¿Quizás con otra biblioteca?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema podría ser utilizar la función de Multibindings de Dagger. Con esta función, podrías definir un conjunto (Set) de ParentClass utilizando las anotaciones @IntoSet que automáticamente agregarán todas las subclases de ParentClass a este conjunto durante el proceso de inyección.

    Aquí hay un ejemplo:

    @Module
    public class ParentClassModule {
    
        @Provides
        @IntoSet
        static ParentClass provideSubClassA() {
            return new SubClassA();
        }
    
        @Provides
        @IntoSet
        static ParentClass provideSubClassB() {
            return new SubClassB();
        }
    
        // y así sucesivamente...
    }
    
    

    Luego, en tu clase ClassManager, inyectarías este conjunto de instancias de ParentClass utilizando la anotación @ElementsIntoSet.

    public class ClassManager {
    
        private Set<parentclass> all;
    
        @Inject
        public ClassManager(@ElementsIntoSet Set<parentclass> all) {
            this.all = all;
        }
    
        // otros métodos aquí abajo
    }
    

    Al utilizar multibindings, puedes evitar tener que agregar manualmente cada subclase de ParentClass en el constructor de tu ClassManager. Esto también puede hacer que tu código sea más modular y mantenible a largo plazo, ya que simplemente puedes agregar una nueva subclase al ParentClassModule y se incluirá automáticamente en el Set<parentclass> durante el proceso de inyección.

    Ten en cuenta que deberás incluir el ParentClassModule en tu componente Dagger, junto con cualquier otro módulo que puedas estar utilizando.

Comments are closed.