Singletons en Dagger 1.x
Al usar Dagger, encontré que estoy recibiendo múltiples instancias de singleton cuando lo inyecto donde sea que lo necesite. He anotado la clase y el método proporciona con @Singleton
. ¿Puede alguien pensar en por qué esto está sucediendo?
Editar:
- Uso de Dagger para inyección de dependencia en constructores
- Inyectar dependencias en singleton con Dagger?
- Daga: Inyectar campo en el pojo proporcionado
- Módulo dependiendo de otro módulo en Dagger
- Dagger para Android: Inyección de una actividad en el gráfico de objetos después de llamar a setContentView
Si me ayuda, he seguido la misma estructura para mi aplicación que la aplicación de ejemplo en GitHub de Dagger ( https://github.com/square/dagger/tree/master/examples/android-activity-graphs ). Estoy tratando de obtener el Singleton en la actividad de base y un par de clases de terceros proporcionados utilizando @Provides
en la clase de Application
personalizada. ¿Es porque estoy más-ing módulos en cada actividad al gráfico del objeto original?
(PS: Soy nuevo en Dagger y DI en general, así que estaré agradecido si pudieras dar una explicación para que yo pueda aprender.) Gracias.
- Cómo compartir Dagger2 Subcomponente entre activies
- Dagger 2 Tercera parte Inyección Android
- Dagger no puede encontrar miembros inyectables en un módulo
- Square Dagger IllegalStateException: No se pudo cargar el adaptador de módulo para la clase MyApplicationModule
- Dagger y inyecciones anidadas
- Dagger con Android: ¿Cómo puedo inyectar el contexto actual?
- ¿Cómo usar la biblioteca dagger en el proyecto de la biblioteca android?
- ¿Hay documentación sobre cuándo Dagger regresa a la reflexión al inyectar dependencias?
@Singleton
, en Dagger 1.x, actúa de manera diferente de lo que usted podría pensar. La definición de la especificación JSR-330 en el javadoc @Singleton
es "una por gráfico" y así es como Dagger la interpreta.
Así que si tienes algo que está marcado como @Singleton
, y se materializa en tu gráfico de aplicación (en contraposición a un gráfico de menor duración), obtendrás una instancia por aplicación.
Si tiene un elemento anotado @Singleton
que está en los módulos que utiliza para configurar su gráfico de actividad (es decir, que se obtiene de la parte de un gráfico especificado por un módulo utilizado en la operación plus (), obtendrá uno por cada -actividad-gráfico.
Si necesita algo para ser una vez por aplicación, debe asegurarse de que se crea como parte del gráfico de aplicación. Puede hacerlo de dos formas. O bien le proporciona explícitamente un método @Provides desde su módulo de aplicaciones, o puede listarlo como una de las clases en @Module (injects = …) en un módulo de aplicación.
(Si no lo marca con @Singleton
, obtendrá uno por cada sitio de inyección.)
Así que recuerde, el gráfico creado por plus () se ve como un gráfico separado que apunta a la gráfica de la que se generó, y lo envuelve, puede acceder a instancias dentro de él, pero no es el mismo gráfico.
Nota – Dagger 2.x mejora esto y admite anotaciones de alcance personalizadas, aunque el mecanismo es similar, con una anotación de gráfico (componente) por ámbito, con una relación padre / hijo entre gráficos de vidas más anchas / más estrechas
- ¿Cómo instalar javadoc para Android Compatibility Package?
- Java.lang.RuntimeException: Realizar detener la actividad que no se reanuda en android