Dagger se puede utilizar para realizar la inyección en un proveedor de contenido?

Recientemente he estado integrando Dagger en un proyecto que utiliza ContentProviders. Creo una única instancia de ObjectGraph en mi objeto Application personalizado y básicamente en cada componente administrado:

  • Actividad,
  • Fragmento,
  • Servicio

… Entonces, llamo a getApplication (), downcast a mi objeto de aplicación personalizado, y forzar la inyección a través de alguna implementación personalizada en mi clase de aplicación. Este parece ser el método prescrito de realizar la inyección basándose en las muestras que he visto publicadas por los chicos en Square.

Este patrón no es válido para las instancias de ContentProvider, ya que su ciclo de vida no está asociado de manera previsible al ciclo de vida del objeto Application, es decir, ContentProviders puede ser, y como estoy observando frecuentemente, creado antes de que se cree el objeto Application. Razones que todavía tengo que comprender).

Así que … ¿alguien tiene una buena manera de inyectar ContentProviders usando Dagger? Hasta ahora lo he logrado al tener una llamada isInjected() al principio de cada uno de los métodos de interfaz de mis ContentProvider (insertar, consultar, actualizar, eliminar) … básicamente una forma hacky de inicialización perezosa. Pero esto parece lejos del ideal. ¿Hay un enfoque más prescripto para inyectar ContentProviders?

La subclase de Application es sólo una convención ya que suele ser el primer objeto creado. Nuestras aplicaciones no tienen proveedores de contenido, por lo que los utilizamos. No hay nada que diga que no se puede poner en otro lugar.

Sólo puede utilizar el patrón singleton tradicional para instanciar y mantener una referencia a la ObjectGraph .

 public final class Dagger { static ObjectGraph og; static ObjectGraph og() { if (og == null) { og = ObjectGraph.create(..); } return og; } } 

La primera persona a la que se accede inicializará la instancia que se utilizará durante toda la vida del proceso.

Si su proveedor de contenido se encuentra en un proceso diferente al de su aplicación principal, esta solución seguirá funcionando. O simplemente puede crear el gráfico cuando se crea su proveedor de contenido ya que será el único consumidor. Normas multi-proceso normales siguen aplicándose, por supuesto, por lo que no se compartirán instancias con los otros procesos.

  • Alcance de la actividad Dagger2, ¿cuántos módulos / componentes necesito?
  • No se puede proporcionar sin un constructor @Inject o de un método @ Proporcionado-anotado
  • Campo no inyectado en el proyecto Android Dagger
  • Dagger 2: Error sobre subcomponentes, pero no tengo subcomponentes en mi aplicación
  • Referencia no resuelta para Dagger 2 en Kotlin
  • Dagger 2.2 método del módulo de constructor de componentes obsoleto
  • Dagger2 Component (un-scoped) no puede depender de los componentes del ámbito - Error
  • ¿Cuándo usar Dagger en la aplicación Android?
  • @Injects después de @Produces?
  • Android Espresso con Dagger
  • ¿La manera más simple de crear un Singleton w / Dagger 2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.