Inyección de múltiples componentes independientes
Mi configuración de puñal para un proyecto androide en el que estoy trabajando: Nota: He proporcionado todo lo necesario @Component, @Module, @Provides anotaciones donde sea necesario.
MainActivity { @Inject A a; @Inject B b; onCreate(){ ComponentX.inject(this); ComponentY.inject(this); } } ComponentX-> ModuleA ->providerA ComponentY -> ModuleB -> providerB
Como puede ver, estos son dos componentes completamente independientes que no están relacionados entre sí de ninguna manera excepto en el punto de inyección.
- ¿Cómo abrir Google Maps con la dirección?
- Datos de paso de Android entre Fragmentos
- Android java, obtener más uso de memoria permitido
- SetEntity en HttpDelete
- El botón puede producir una excepción de puntero nulo (Android Studio)
Durante la compilación consigo el error siguiente:
In file A.java error: B cannot be provided without an @Provides- or @Produces-annotated method. MainActivity.b [injected field of type: B b]
¿Me equivoco al pensar que se pueden usar múltiples componentes mientras se usa la daga 2 o se supone que la aplicación usa un componente grande que se encarga de todas las inyecciones?
¿Puede alguien ayudarme a entender a dónde me equivoco?
- ¿Cómo destruir y recrear una escena en andengine correctamente?
- ¿Cómo puedo hacer negrita y subrayar una cadena dinámicamente en el código de Android?
- ¿Por qué no se debería escribir una aplicación de Android en C / C ++ porque "simplemente prefieres programar en C / C ++"?
- Gradle: ¿Cómo puedo incluir un jar local de un proyecto de java dependiente en una compilación de Android?
- Deserializando un tipo genérico con Jackson
- Android Alert Dialog Fondo de aplicación API 11+
- Error: Error al capturar la instantánea de los archivos de salida de la tarea 'transformClassesWithDexForDebug' durante el cheque actualizado
- Lectura de metadatos EXIF de jpeg de androide de devolución de llamada de imagen
No es necesario tener un solo componente, hay varias maneras de modularizarlos, pero cada objeto que se crea o se inyecta valores en, debe tener todos sus valores proporcionados por un solo componente.
Una forma de reestructurar su código es que ComponentY dependa de ComponentX, o viceversa, por ejemplo
@Component(dependencies = ComponentX.class) interface ComponentY { void inject(MainActivity activity); }
O puede crear un tercer componente, digamos ComponentZ, si ComponentX y ComponentY son completamente ortogonales entre sí.
@Component(dependencies = {ComponentX.class, ComponentY.class}) interface ComponentZ { void inject(MainActivity activity); }
O simplemente podría reutilizar los módulos, por ejemplo
@Component(modules = {ModuleA.class, ModuleB.class}) interface ComponentZ { void inject(MainActivity activity); }
Cómo exactamente usted decide dividirlo depende en gran medida de la estructura de su código. Si los componentes X e Y son visibles, pero los módulos no lo son, utilice dependencias de componentes, ya que (y las depedencias de módulos) son realmente detalles de implementación del componente. De lo contrario, si los módulos son visibles entonces simple reutilizarlos.
Yo no utilizaría los ámbitos para esto, ya que son realmente para la gestión de objetos con diferentes lifespans, por ejemplo, los objetos asociados con un usuario específico cuya vida útil es el tiempo desde el momento en que un usuario inicia sesión cuando se desconectan o la vida útil de una solicitud específica . Si tienen diferentes vida útil, entonces usted está buscando en el uso de ámbitos y subcomponentes.
Se supone que la aplicación utiliza un componente grande
Deberías pensarlo en ámbitos. Para un ámbito determinado, hay un componente. Los ámbitos son, por ejemplo, ApplicationScope
, FragmentScope
(retenido), ActivityScope
, ViewScope
. Para cada ámbito, hay un componente dado; Los ámbitos no se comparten entre los componentes.
(Esto significa que si desea tener singletons globales en el @ApplicationScope
, hay un componente de ámbito de aplicación para @ApplicationScope
desea clases específicas de la actividad, a continuación, crear un componente para ello para esa actividad específica, que dependerá de El componente de ámbito de aplicación).
Consulte @MyDogTom para la anotación @Subcomponent
, pero también puede usar dependencias de componentes para la creación de componentes subscoped.
@YScope @Component(dependencies = ComponentX.class, modules=ModuleB.class) public interface ComponentY extends ComponentX { B b(); void inject(MainActivity mainActivity); } @XScope @Component(modules=ModuleA.class) public interface ComponentX{ A a(); } ComponentY componentY = DaggerComponentY.builder().componentX(componentX).build();
¿Se supone que la aplicación utiliza un componente grande que se encarga de todas las inyecciones?
Puede utilizar Subcomponent
. En su caso, la declaración de componentes se verá así:
@Subcomponent(modules=ModuleB.class) public interface ComponentY{ void inject(MainActivity mainActivity); } @Component(modules=ModuleA.class) public interface ComponentX{ ComponentY plus(ModuleB module); }
Creación de ComponentY
: creationCompunentY = ComponentX.plus(new ModuleB());
Ahora en MainActivity
se llama sólo ComponentY.inject(this);
MainActivity { @Inject A a; @Inject B b; onCreate(){ ComponentY.inject(this); } }
Puede encontrar más información sobre los subcomponentes en la migración de la guía Dagger1 (ver parte de Subgraphs), Subcomponente JavaDoc y Component JavaDoc (consulte la parte Subcomponentes).
- Travis CI para Android – Error de compilación: No se pudo encontrar el destino y no se encontraron dependencias
- Implementación de un gráfico de filtro de entrada múltiple con la librería Libavfilter en Android NDK