Inyección de dependencias en Swift

Buenas a todos!

Como ya he comentado en algún otro post, últimamente he estado migrando mi aplicación TopProfe a Kotlin. La aplicación migrada al 90% ya se encuentra en el PlayStore  😁

Una vez conseguido ese primer reto, comencé a desarrollar la misma aplicación pero para dispositivos iOS en Swift. Iré comentando por aquí las principales diferencias que vaya encontrando tanto a nivel de lenguaje como de plataforma de desarrollo.

En este primer post sobre Swift, voy a explicar como resolví el problema de la inyección de dependencias sin usar ningún framework para ello. En la aplicación de TopProfe utilizo Dagger 2 para resolver este problema, por lo que comencé a buscar frameworks parecidos para Swift.

Encontré alguno que otro como por ejemplo Cleanse de Square ó Swinject, pero ninguno me convenció. La curva de aprendizaje era demasiado grande como para un proyecto que quiero sacar rápido y probar.

Así que comencé a buscar posts sobre como los desarrolladores de iOS resuelven este problema, y me recomendaron este de @juan_cazalla en el que planteaba una solución. Me encantó la idea de los protocolos encargados de definir las dependencias, y sus extensiones de instanciarlas.

Las extensiones no me solucionaban el problema al 100% porque no permiten contener instancias, por lo que no podía tener mis instancias globales únicas. Así que decidí adaptarlo a mi problema añadiendo un nuevo módulo que se encarga de proveer las dependencias globales comunes a toda la aplicación.

Quiero enseñaros mi solución a partir del post de Juan. En mi caso necesitaba tener instancias globales únicas, como por ejemplo las instancias referidas a los repositorios de datos, por lo que decidí separar mis dependencias en módulos. Cada VC tiene definido su módulo asociado con las dependencias que necesita, de esta forma:

Por tanto, el módulo que se expone al exterior solo conoce como proveer el VC ya que las dependencias asociadas con este se definen en el protocolo ProfessorsModuleAssembler que es privado.

Todos los módulos reciben por constructor una instancia de CommonAssembler, que es el encargado de proveer las instancias globales anteriormente mencionadas. Tiene esta pinta más o menos:

Con instancias lazy de los repositorios me aseguro de que solo se instancian la primera vez que se quiere hacer uso, evitando instanciar todo cuando se inicie la aplicación. Aparte, consigo que sea la misma instancia siempre la que se pasa a los distintos módulos que proveen las dependencias lo que me permite escribir fácilmente los test.

Os estaréis preguntando cual es la forma de crear los módulos para cada VC, y es la clase DependencyFactory la encargada también de esto.

DependencyFactory implementa el protocol público ProfessorsModule y además tiene una instancia lazy de este mismo, que actúa como delegado. No me termina de convencer del todo esta aproximación, ya que de momento solo hay un VC pero cuando la aplicación crezca, esta clase podría llegar a ser enorme. En cuanto tenga una solución mejor, la compartiré 🤓

Espero que os haya gustado!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s