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?
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
) deParentClass
utilizando las anotaciones@IntoSet
que automáticamente agregarán todas las subclases deParentClass
a este conjunto durante el proceso de inyección.Aquí hay un ejemplo:
Luego, en tu clase
ClassManager
, inyectarías este conjunto de instancias deParentClass
utilizando la anotación@ElementsIntoSet
.Al utilizar multibindings, puedes evitar tener que agregar manualmente cada subclase de
ParentClass
en el constructor de tuClassManager
. 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 alParentClassModule
y se incluirá automáticamente en elSet<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.