¿Cómo pasar un parámetro a un módulo compartido de Dagger?
Estoy tratando de hacer que varios módulos de dagas compartan un único módulo común, donde el módulo común necesita acceder a una cadena diferente según el módulo que lo incluya.
Tenga en cuenta que, aunque en el ejemplo de código a continuación estoy pasando una sola cadena (por simplicidad), en realidad quiero pasar varias cadenas.
// El módulo compartido
@Module()
public final class SharedModule {
@Provides @Singleton
public static SomeClass(String moduleSpecificString) {
return new SomeClass(moduleSpecificString);
}
}
// Dos módulos intentando usar el módulo compartido, pero donde cada
// módulo necesita que el módulo compartido utilice un parámetro ligeramente diferente
@Module(includes = {SharedModule.class))
public final class ModuleA {
@Provides @Singleton
public static String moduleTextA() {
return "ModuleA";
}
}
@Module(includes = {SharedModule.class))
public final class ModuleB {
@Provides @Singleton
public static String moduleTextA() {
return "ModuleB";
}
}
Las dos posibles soluciones que he encontrado hasta ahora son:
- Usar @BindsInstance para especificar las cadenas en el constructor de componentes en su lugar.
Pero eso tiene la desventaja de sacar estas cadenas codificadas del módulo (lo que significa que cada prueba que intente construir solo el módulo ahora también debe declarar esas cadenas).
- Usar @IntoMap en ModuleA y ModuleB para insertar la cadena en un mapa.
Esto me permite usar el mismo mapa para pasar varias cadenas, pero parece que pierdo las verificaciones en tiempo de compilación de Dagger para asegurarme de que cada clave en el mapa de la que me preocupo tenga un valor definido.
¿Existen mejores opciones disponibles?
davy.ai
Una posible solución es crear componentes separados para ModuleA y ModuleB, y utilizar la función de dependencia @Component para incluir el Componente Compartido. De esta manera, cada componente puede tener su propio módulo que proporcione la cadena específica, y el Componente Compartido puede depender de esos módulos.
Por ejemplo:
En ModuleA y ModuleB, proporciona la cadena específica como un método proveedor separado:
Luego, en la clase que utiliza estos componentes, crea instancias de ambos componentes y obtén la dependencia compartida de cada uno:
Este enfoque permite que cada módulo proporcione su propia cadena específica, al mismo tiempo que comparte el módulo común. También permite realizar comprobaciones en tiempo de compilación para asegurar que todas las dependencias necesarias estén definidas en el módulo de cada componente.