🧅 Arquitectura Cebolla (Onion Architecture) Cheatsheet Completo 🧅

La Arquitectura Cebolla, propuesta por Jeffrey Palermo, es un patrón de diseño de software que organiza el código en capas concéntricas, similar a las capas de una cebolla. El objetivo principal es proteger y centralizar el modelo de dominio y la lógica de negocio, haciéndolos independientes de la infraestructura (bases de datos, frameworks web, UI, servicios externos).


1. 🌟 Conceptos Clave


2. 🌀 Las Capas (Círculos Concéntricos)

La Arquitectura Cebolla típicamente define cuatro capas principales, aunque el número exacto puede variar ligeramente en la práctica. Cada capa depende solo de las capas que están más cerca del centro.

2.1. 🔵 1. Dominio (Domain Layer) - El Núcleo Interno

2.2. 🟢 2. Capa de Servicios de Dominio (Domain Services Layer)

2.3. 🟡 3. Capa de Servicios de Aplicación (Application Services Layer)

2.4. 🔴 4. Capa de Infraestructura (Infrastructure Layer)


3. 🎯 La Regla de Dependencia


4. 🛠️ Estructura Práctica de Proyectos (Ejemplo C# / Java)

MyApplication.sln (Solución) / my-application (Proyecto Raíz)
├── MyApplication.Domain/     # Capa de Dominio (Proyecto o Módulo)
│   ├── Entities/
│   │   └── Product.cs / .java
│   ├── Services/             # Interfaces de Servicios de Dominio
│   │   └── IProductValidator.cs / .java
│   └── Repositories/         # Interfaces de Repositorios
│       └── IProductRepository.cs / .java

├── MyApplication.DomainServices/ # Capa de Servicios de Dominio (Proyecto o Módulo)
│   └── Services/
│       └── ProductValidator.cs / .java (Implementa IProductValidator)

├── MyApplication.Application/ # Capa de Servicios de Aplicación (Proyecto o Módulo)
│   ├── UseCases/
│   │   ├── CreateProduct/
│   │   │   ├── CreateProductCommand.cs / .java (Request DTO)
│   │   │   ├── CreateProductResponse.cs / .java (Response DTO)
│   │   │   └── ICreateProductUseCase.cs / .java
│   │   └── CreateProductUseCase.cs / .java (Implementa ICreateProductUseCase)
│   ├── Mappers/              # DTO Mappers (ej. Mapster, AutoMapper)
│   │   └── ProductMapper.cs / .java
│   └── Services/             # Otros servicios de aplicación

├── MyApplication.Infrastructure/ # Capa de Infraestructura (Proyecto o Módulo)
│   ├── Data/                 # Implementaciones de Repositorios
│   │   └── JpaProductRepository.cs / .java (Implementa IProductRepository)
│   ├── PersistenceModels/    # Entidades de ORM
│   │   └── ProductEntity.cs / .java
│   ├── ExternalServices/     # Clientes de APIs externas
│   │   └── ThirdPartyEmailService.cs / .java
│   └── Logging/
│       └── ConsoleLogger.cs / .java

├── MyApplication.WebUI/      # Capa de UI/Presentación (Proyecto o Módulo)
│   ├── Controllers/          # Controladores Web (ASP.NET Core / Spring MVC)
│   │   └── ProductsController.cs / .java (Usa ICreateProductUseCase)
│   ├── ViewModels/           # ViewModels para la UI
│   │   └── ProductViewModel.cs / .java
│   ├── Startup.cs / MainApp.java # Configuración de DI
│   └── appsettings.json / application.properties

├── MyApplication.Tests/      # Capa de Pruebas
│   ├── DomainTests/
│   ├── ApplicationTests/
│   └── InfrastructureTests/

5. 📈 Beneficios


6. ⚠️ Desventajas y Desafíos


7. 🤝 Relación con Otras Arquitecturas Limpias

La Arquitectura Cebolla, Hexagonal y Limpia son a menudo consideradas como variaciones o evoluciones del mismo concepto central. Todas comparten la idea de:

En esencia, si entiendes una, entiendes las ideas fundamentales de todas ellas. La elección de una sobre otra a menudo se reduce a la terminología preferida o a matices de cómo se subdividen las capas internas.


8. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de la Arquitectura Cebolla, cubriendo sus principios fundamentales, la estructura de sus capas, la crucial regla de dependencia, sus beneficios y desafíos, y las mejores prácticas para implementar sistemas robustos, desacoplados y testables.