0

Arquitectura de Software con C# 14: Introducción a la Arquitectura Hexagonal (Ports & Adapters)

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ísticaClean ArchitectureHexagonal Architecture
EstructuraCapas concéntricasNúcleo de negocio rodeado de puertos y adaptadores
EnfoqueDominio en el centroPuertos que conectan negocio con infraestructura
Independencia de tecnologíaAltaMuy Alta
ModularidadAltaAlta
EscalabilidadAltaAlta
ComplejidadMediaMedia-Alta
Casos de usoAplicaciones empresariales, SaaS, MicroserviciosAplicaciones con múltiples fuentes de datos o integraciones

Cómo funciona la Arquitectura Hexagonal

La Arquitectura Hexagonal divide el sistema en tres partes principales:

  1. Núcleo del dominio → Contiene la lógica de negocio pura.
  2. Puertos (Ports) → Interfaces que definen cómo se comunica el núcleo con el mundo exterior.
  3. 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.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *