Introducción a la clase
Después de haber implementado Clean Architecture con DDD, pasamos al Módulo 3, donde exploraremos Arquitectura Hexagonal (Ports & Adapters).
La Arquitectura Hexagonal permite desacoplar el núcleo de negocio de la infraestructura externa, facilitando la integración con diferentes tecnologías y promoviendo la flexibilidad.
¿Qué obtendrás de esta clase?
- Aprenderás qué es Arquitectura Hexagonal y cómo se diferencia de Clean Architecture.
- Comprenderás el concepto de puertos y adaptadores para desacoplar infraestructura.
- Verás un ejemplo en C# aplicando esta arquitectura.
- Conocerás los beneficios y desventajas de esta aproximación.
¿Qué es la Arquitectura Hexagonal?
La Arquitectura Hexagonal, también conocida como Ports & Adapters, fue propuesta por Alistair Cockburn con el objetivo de separar la lógica de negocio de las dependencias externas.
A diferencia de Clean Architecture, donde las capas están organizadas en círculos concéntricos, la Arquitectura Hexagonal coloca la lógica de negocio en el centro y la rodea con interfaces (puertos) que permiten la comunicación con el exterior a través de adaptadores.
Principios de la Arquitectura Hexagonal
- Independencia de infraestructura → La lógica de negocio no depende de la base de datos, frameworks o interfaces externas.
- Interacción a través de interfaces (puertos) → La aplicación define contratos de comunicación y los adaptadores los implementan.
- Alta flexibilidad → Se pueden cambiar tecnologías sin afectar la lógica central.
Comparación entre Clean Architecture y Arquitectura Hexagonal
Característica | Clean Architecture | Hexagonal Architecture |
---|---|---|
Estructura | Capas concéntricas | Núcleo de negocio rodeado de puertos y adaptadores |
Enfoque | Dominio en el centro | Puertos que conectan negocio con infraestructura |
Independencia de tecnología | Alta | Muy Alta |
Modularidad | Alta | Alta |
Escalabilidad | Alta | Alta |
Complejidad | Media | Media-Alta |
Casos de uso | Aplicaciones empresariales, SaaS, Microservicios | Aplicaciones con múltiples fuentes de datos o integraciones |
Cómo funciona la Arquitectura Hexagonal
La Arquitectura Hexagonal divide el sistema en tres partes principales:
- Núcleo del dominio → Contiene la lógica de negocio pura.
- Puertos (Ports) → Interfaces que definen cómo se comunica el núcleo con el mundo exterior.
- Adaptadores (Adapters) → Implementaciones de los puertos que interactúan con tecnologías externas.
┌──────────────────────────────┐
│ Adaptador de Base de Datos │
├──────────────────────────────┤
│ Puerto │ ← Interfaz de Repositorio
├──────────────────────────────┤
│ Núcleo del Dominio │ ← Lógica de negocio pura
├──────────────────────────────┤
│ Puerto │ ← Interfaz de Servicio Externo
├──────────────────────────────┤
│ Adaptador de API REST │
└──────────────────────────────┘
Ejemplo en C#: Implementación de Arquitectura Hexagonal
Paso 1: Definir el Núcleo del Dominio (Capa de Dominio)
public class Pedido
{
public int Id { get; private set; }
public string Cliente { get; private set; }
public decimal Total { get; private set; }
public Pedido(int id, string cliente, decimal total)
{
Id = id;
Cliente = cliente;
Total = total;
}
}
Paso 2: Crear un Puerto para el Repositorio (Capa de Aplicación)
El puerto es una interfaz que define las operaciones que pueden realizarse sobre Pedido
.
public interface IPedidoRepository
{
void Guardar(Pedido pedido);
Pedido ObtenerPorId(int id);
}
Paso 3: Implementar un Adaptador de Base de Datos (Capa de Infraestructura)
El adaptador implementa el puerto y usa Entity Framework Core para acceder a la base de datos.
public class PedidoRepository : IPedidoRepository
{
private readonly AppDbContext _context;
public PedidoRepository(AppDbContext context)
{
_context = context;
}
public void Guardar(Pedido pedido)
{
_context.Pedidos.Add(pedido);
_context.SaveChanges();
}
public Pedido ObtenerPorId(int id)
{
return _context.Pedidos.FirstOrDefault(p => p.Id == id);
}
}
Paso 4: Implementar un Caso de Uso en la Aplicación
public class CrearPedidoUseCase
{
private readonly IPedidoRepository _repository;
public CrearPedidoUseCase(IPedidoRepository repository)
{
_repository = repository;
}
public void Ejecutar(Pedido pedido)
{
_repository.Guardar(pedido);
}
}
Paso 5: Implementar un Adaptador de API REST (Capa de Presentación)
El controlador REST actúa como adaptador, permitiendo que la API interactúe con el sistema.
[ApiController]
[Route("api/pedidos")]
public class PedidoController : ControllerBase
{
private readonly CrearPedidoUseCase _crearPedidoUseCase;
private readonly IPedidoRepository _pedidoRepository;
public PedidoController(CrearPedidoUseCase crearPedidoUseCase, IPedidoRepository pedidoRepository)
{
_crearPedidoUseCase = crearPedidoUseCase;
_pedidoRepository = pedidoRepository;
}
[HttpPost]
public IActionResult CrearPedido([FromBody] Pedido pedido)
{
_crearPedidoUseCase.Ejecutar(pedido);
return Ok("Pedido creado exitosamente");
}
[HttpGet("{id}")]
public IActionResult ObtenerPedido(int id)
{
var pedido = _pedidoRepository.ObtenerPorId(id);
if (pedido == null)
return NotFound();
return Ok(pedido);
}
}
Beneficios de la Arquitectura Hexagonal
- Alta flexibilidad → Facilita la integración con múltiples tecnologías.
- Independencia de la infraestructura → Se pueden cambiar bases de datos, APIs o frameworks sin afectar la lógica de negocio.
- Código más modular y fácil de probar.
Errores comunes al implementar la Arquitectura Hexagonal
- No definir puertos correctamente → La lógica de negocio termina acoplada a la infraestructura.
- No usar interfaces en la Capa de Aplicación → Hace difícil cambiar tecnologías sin afectar la lógica central.
- Usar acceso directo a la base de datos en la lógica de negocio → Debe gestionarse a través de puertos y adaptadores.
Cuestionario de Autoevaluación
- ¿Cómo funciona la Arquitectura Hexagonal y en qué se diferencia de Clean Architecture?
- ¿Cuál es el propósito de los Puertos en esta arquitectura?
- ¿Cómo ayudan los Adaptadores a desacoplar la lógica de negocio?
- ¿Cómo manejarías múltiples fuentes de datos en esta arquitectura?
- ¿Cómo implementarías pruebas unitarias en una aplicación con esta arquitectura?
Resumen de la Clase
- La Arquitectura Hexagonal desacopla la lógica de negocio mediante Puertos y Adaptadores.
- Permite cambiar infraestructura sin afectar el núcleo del negocio.
- Facilita la integración con múltiples tecnologías y mejora la mantenibilidad.
- Se aplica en sistemas donde la flexibilidad y escalabilidad son esenciales.
Próximo paso
En la siguiente clase veremos cómo integrar DDD en la Arquitectura Hexagonal.