tutorial - Inyección de dependencia de Java: Dagger 1 vs Dagger 2, ¿cuál es mejor?
inject class android (2)
Algunas ventajas y desventajas tomadas de https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ y http://google.github.io/dagger/dagger-1-migration.html :
Ventajas de Daga 2:
- No más reflexiones: todo se hace como llamadas concretas (ProGuard funciona sin ninguna configuración)
- No más composición de gráficos de tiempo de ejecución: mejora el rendimiento, incluidos los casos por solicitud
- Rastreable: el código mejor generado y la ausencia de reflexión ayudan a que el código sea legible y fácil de seguir
- Admite la inyección de métodos además de la inyección de campo y constructor, que fueron los únicos dos tipos admitidos por Dagger 1
- Los módulos requieren menos configuración que Dagger 1
- Permite a los usuarios utilizar cualquier anotación de ámbito bien formada. Dagger 1 solo admite un solo ámbito:
@Singleton
.
Y desventajas:
- El método
inject()
ahora tiene una asociación de tipo fuerte con el objetivo de inyección. Esto es bueno para la depuración, pero complica una práctica común de inyectar desde clases base (por ejemplo, actividades base, fragmentos, etc.). - La implementación del componente requiere la reconstrucción del proyecto para que aparezca y cualquier error de compilación relacionado con la inyección hace que la clase desaparezca (es decir, no se genere).
- No soporta
overrides
. Los módulos que se anulan para pruebas falsas simples pueden crear una subclase del módulo para emular ese comportamiento. Los módulos que utilizan anulaciones y dependen de la inyección de dependencia deben descomponerse de manera que los módulos anulados se representen como una opción entre dos módulos.
EDICIÓN 2016/11/16: Esto no es una ventaja técnica, pero Dagger 1 ahora está en desuso (a partir del 15 de septiembre de 2016) y ya no se desarrollará activamente. Recomiendan migrar a Dagger 2.
¿Cuáles son las ventajas de Dagger 2 sobre Dagger 1 ?
Hasta ahora he encontrado (solo) 2:
- Dagger 2 le permite usar el código ofuscación con proguard
- Dagger 2 es más rápido (lo cual no es una gran ventaja cuando se usa para aplicaciones de Android, pero es algo importante si lo usas para algún tipo de servidor)
Al mismo tiempo, encontré una gran desventaja: no puedes tener anulaciones de módulo ( @Module(overrides = true)
) en Dagger 2, que es bastante molesto al menos para mí, fue muy útil para la prueba de unidad.
¿Existen otras ventajas / desventajas?
No recomendaría echar un vistazo al toothpick .
Como coautor, obviamente estoy demasiado sesgado, pero sí, este es mucho más fácil de usar, al menos tan rápido en la mayoría de los casos como las dagas. Y, en realidad, el árbol de ámbitos es una forma muy poderosa de desarrollar funciones más avanzadas, como el reciclaje de instancias en ámbitos que abarcan múltiples actividades.