0

Arquitectura de Software con C# 05: Tácticas y Patrones de DDD (Entidades, Agregados, Value Objects)

Introducción a la clase

Ahora que entendemos qué es Domain-Driven Design (DDD) y su enfoque estratégico, es momento de profundizar en sus tácticas y patrones clave.

En esta clase aprenderemos sobre:

  • Entidades, Agregados y Value Objects, elementos fundamentales de DDD.
  • Cómo estos patrones ayudan a estructurar el dominio de una aplicación.
  • Implementaciones en C# con ejemplos prácticos.

Al finalizar esta lección, tendrás el conocimiento necesario para modelar dominios ricos y bien organizados en arquitecturas como Clean Architecture, Hexagonal y Vertical Slice.

¿Qué obtendrás de esta clase?

  • Comprenderás qué son las Entidades, Agregados y Value Objects.
  • Aprenderás cómo modelar correctamente un dominio en C# usando estos patrones.
  • Verás ejemplos prácticos aplicados a un sistema de pedidos de e-commerce.
  • Entenderás cómo estos conceptos mejoran la modularidad y mantenibilidad del código.

¿Qué son las Entidades en DDD?

Las Entidades son objetos que tienen una identidad única dentro del dominio y persisten en el tiempo.

Características de una Entidad

  • Tiene un identificador único (ID).
  • Puede tener propiedades y comportamientos.
  • Se modifica a lo largo de su ciclo de vida.

Ejemplo en C#: Creando una Entidad «Pedido»

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;
    }

    public void AplicarDescuento(decimal porcentaje)
    {
        Total -= Total * (porcentaje / 100);
    }
}

Errores comunes al modelar Entidades

  • No proteger la identidad → Debe ser inmutable y única.
  • Tener lógica ajena al dominio → La entidad debe enfocarse en reglas de negocio, no en persistencia o UI.

¿Qué son los Value Objects en DDD?

Los Value Objects son objetos sin identidad, cuyo propósito es representar un concepto en el dominio.

Características de un Value Object

  • No tiene un identificador único.
  • Su comparación se basa en sus valores, no en su referencia en memoria.
  • Son inmutables (una vez creados, no cambian).

Ejemplo en C#: Creando un Value Object «Dirección»

public class Direccion
{
    public string Calle { get; }
    public string Ciudad { get; }
    public string CodigoPostal { get; }

    public Direccion(string calle, string ciudad, string codigoPostal)
    {
        Calle = calle;
        Ciudad = ciudad;
        CodigoPostal = codigoPostal;
    }

    public override bool Equals(object obj)
    {
        if (obj is Direccion other)
        {
            return Calle == other.Calle && Ciudad == other.Ciudad && CodigoPostal == other.CodigoPostal;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Calle, Ciudad, CodigoPostal);
    }
}

Cuándo usar Value Objects en lugar de Entidades

  • Cuando el objeto no necesita un ID único.
  • Cuando representa un concepto inmutable (ej. dinero, coordenadas, colores, direcciones).
  • Cuando se pueden comparar por sus valores en lugar de por identidad.

¿Qué son los Agregados en DDD?

Un Agregado es un conjunto de Entidades y Value Objects que forman una unidad lógica y coherente dentro del dominio.

Características de un Agregado

  • Tiene una Entidad Raíz que gestiona el estado del agregado.
  • Protege la consistencia de los datos dentro del agregado.
  • Expone métodos para interactuar con sus elementos internos.

Ejemplo en C#: Creando un Agregado «Pedido» con Productos

public class Pedido
{
    private readonly List<Producto> _productos = new List<Producto>();

    public int Id { get; private set; }
    public string Cliente { get; private set; }
    public decimal Total => _productos.Sum(p => p.Precio);

    public IReadOnlyCollection<Producto> Productos => _productos.AsReadOnly();

    public Pedido(int id, string cliente)
    {
        Id = id;
        Cliente = cliente;
    }

    public void AgregarProducto(Producto producto)
    {
        _productos.Add(producto);
    }
}

public class Producto
{
    public int Id { get; private set; }
    public string Nombre { get; private set; }
    public decimal Precio { get; private set; }

    public Producto(int id, string nombre, decimal precio)
    {
        Id = id;
        Nombre = nombre;
        Precio = precio;
    }
}

Errores comunes al trabajar con Agregados

  • Exponer referencias directas a las entidades internas.
    • Solución: Usar métodos en la entidad raíz para modificar el agregado.
  • Hacer agregados demasiado grandes.
    • Solución: Un agregado solo debe contener elementos estrechamente relacionados.

Comparación entre Entidades, Value Objects y Agregados

ConceptoCaracterísticas principales
EntidadTiene un identificador único. Puede cambiar en el tiempo.
Value ObjectNo tiene ID, se identifica por su valor. Es inmutable.
AgregadoGrupo de Entidades y Value Objects que forman una unidad lógica.

Cuestionario de Autoevaluación

  1. ¿Cuál es la diferencia principal entre una Entidad y un Value Object?
  2. ¿Por qué los Value Objects deben ser inmutables?
  3. ¿Qué es un Agregado y cuál es su propósito?
  4. ¿Cuáles son los errores más comunes al trabajar con Agregados?
  5. ¿Cómo protege un Agregado la consistencia de los datos en el dominio?

Resumen de la Clase

  • Las Entidades tienen un identificador único y persisten en el tiempo.
  • Los Value Objects no tienen ID, son inmutables y se identifican por su valor.
  • Los Agregados agrupan Entidades y Value Objects bajo una Entidad Raíz.
  • DDD nos ayuda a estructurar el dominio de manera clara y expresiva.

Próximo paso

En la siguiente clase, analizaremos cuándo usar cada arquitectura y sus beneficios en proyectos reales.

Fernando Sonego

Deja una respuesta

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