La Onion Architecture (o en capas de cebolla) fue implementada por Jeffrey Palermo y proporciona una forma eficaz de construir aplicaciones para mejorar su testeo, mantenimiento y gestion de dependencias. En Onion, las capas se comunican a través de interfaces por lo tanto esta pensada para lenguajes de programación orientados a objetos.
Este tipo de arquitectura esta basada en la inversion de dependencias, las dependencias van desde fuera hacia dentro. Esta compuesta de varias capas concéntricas que se comunican a través de interfaces a medida que vamos acercándonos al centro. Es aquí en el centro donde tenemos las entidades de dominio.
Por qué Onion Architecture
- Separación de responsabilidades y limites claros entre capas.
- Facilita el testeo de nuestra aplicación y el mantenimiento.
- Proporciona facilidad para cambiar las tecnologías en la capa de infraestructura sin afectar al core de la aplicación.
- Se centra en las reglas de dominio y su lógica.
Capa de dominio
Es la capa central de la Onion Architecture. Aquí se representa el negocio y el comportamiento de los objetos. Las entidades que están modeladas de tal forma que no dependen de un ORM. Además no tienen dependencias externas, es decir, el dominio solo puede depender de si mismo. No tienen operaciones de entrada/salida y son puramente lógicas. Esto quiere decir que si nuestra aplicación hace uso de ORM las entidades van a ser simples clases sin lógica del ORM.
Capa de repositorio
La capa de repositorio, o servicios de dominio, define las interfaces que definen nuestra capa de persistencia a base de datos o cualquier tipo de persistencia, como puede ser guardar información en ficheros dentro del sistema de ficheros de la aplicación. La implementación de estas interfaces se hará en la capa de infraestructura, ya que este tipo de implementaciones que pueden hacer nuestra aplicación inestable en caso de que tengamos que cambiar el motor de base de datos, se llevan a la capa mas externa para así dejar la lógica de negocio sin cambios.
Capa de servicio
La capa de aplicación implementa los casos de uso. Aquí se encuentran nuestros servicios de aplicacion que implementan la lógica de negocio. Se encarga de la interacción con la capa de dominio y la de infraestructura.
Capa de presentación
Esta capa es que la mas periférica de la Onion Architecture y es la que comunica la aplicación con el mundo exterior. Aquí tenemos los adaptadores de infraestructura que nos comunican con servicios como RabbitMQ o la base de datos. También podemos tener nuestra interfaz de usuario, por ejemplo una API, que recibe peticiones de clientes web o móviles. Por ultimo también podemos considerar a los tests de integración como parte de esta capa, ya que podríamos probar nuestra aplicación en su conjunto.
Onion vs Clean Architecture
Como podemos ver, tanto en la Onion Architecture como en la Clean el centro son las entidades de dominio. Podemos apreciar que son arquitecturas muy parecidas, de hecho Clean esta inspirada por Onion. Hay que tener en cuenta que Onion esta pensada para implementar con lenguajes orientados a objetos, por lo que una diferencia que podemos ver es que la capa de repositorio no aparece en la arquitectura Clean, pero en la Onion se ve reflejada con la declaración de interfaces de repositorio.
Las dos arquitecturas proporcionan una separación de responsabilidades óptima y nos permite testear nuestra aplicación por capas fácilmente gracias a tests unitarios, testeo de toda la aplicación con tests de integración y la facilidad de cambiar la implementación a nivel aplicación/infraestructura en caso de que tengamos que migrar nuestra base de datos, usemos una distinta en nuestro entorno de tests o tengamos que conectar nuestra aplicación con un servicio web o una app móvil.