0

Arquitectura de Software con C# 10: Implementación de Entidades, Agregados y Value Objects en Clean Architecture

Introducción a la clase

En la clase anterior aprendimos cómo integrar Domain-Driven Design (DDD) en Clean Architecture. Ahora profundizaremos en la implementación práctica de Entidades, Agregados y Value Objects en un proyecto real en C#.

¿Qué obtendrás de esta clase?

  • Aprenderás cómo modelar Entidades, Agregados y Value Objects en Clean Architecture.
  • Implementarás un dominio basado en DDD dentro de la Capa de Dominio.
  • Verás ejemplos de cómo estos conceptos mejoran la cohesión y consistencia del negocio.
  • Conocerás buenas prácticas y errores comunes al modelar el dominio.

Paso 1: Creación de Entidades en la Capa de Dominio

Las Entidades representan objetos del dominio con una identidad única y lógica de negocio.

Ejemplo en C#: Entidad Pedido

public class Pedido
{
    public int Id { get; private set; }
    public string Cliente { get; private set; }
    public DateTime Fecha { get; private set; }
    private readonly List<Producto> _productos = new List<Producto>();

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

    public Pedido(int id, string cliente)
    {
        Id = id;
        Cliente = cliente;
        Fecha = DateTime.UtcNow;
    }

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

    public decimal CalcularTotal()
    {
        return _productos.Sum(p => p.Precio);
    }
}

Buenas prácticas en Entidades:

  • Privatizar setters para evitar modificaciones no controladas.
  • Usar listas privadas para evitar modificaciones directas.
  • Exponer datos a través de métodos y propiedades de solo lectura.

Paso 2: Creación de Value Objects en la Capa de Dominio

Los Value Objects representan conceptos sin identidad única y deben ser inmutables.

Ejemplo en C#: 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);
    }
}

Buenas prácticas en Value Objects:

  • Inmutabilidad: No modificar los valores después de la creación.
  • Comparación por valores, no por referencia.
  • Pequeños y reutilizables dentro del dominio.

Paso 3: Creación de un Agregado en la Capa de Dominio

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

Ejemplo en C#: Agregado Pedido con Productos

public class Pedido
{
    public int Id { get; private set; }
    public string Cliente { get; private set; }
    private readonly List<Producto> _productos = new List<Producto>();

    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 decimal CalcularTotal()
    {
        return _productos.Sum(p => p.Precio);
    }
}

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

Buenas prácticas en Agregados:

  • Encapsular la lógica dentro de la entidad raíz (en este caso, Pedido).
  • Evitar relaciones innecesarias dentro del agregado.
  • Exponer solo métodos necesarios para modificar el agregado.

Errores comunes al implementar Entidades, Agregados y Value Objects

  • Exponer listas directamente en los Agregados.
    Solución: Usar listas privadas con métodos controlados.
  • Modificar los valores de un Value Object.
    Solución: Hacerlos inmutables (solo con getters).
  • No definir un Agregado cuando es necesario.
    Solución: Agrupar entidades relacionadas en una unidad lógica coherente.

Cuestionario de Autoevaluación

  • ¿Cuál es la diferencia entre una Entidad y un Value Object?
  • ¿Por qué los Value Objects deben ser inmutables?
  • ¿Cómo protege un Agregado la consistencia de los datos en el dominio?
  • ¿Qué ventajas tiene encapsular listas dentro de un Agregado?
  • ¿Cuál es la importancia de privatizar setters en Entidades?

Resumen de la Clase

  • Las Entidades tienen identidad única y pueden modificarse a lo largo del tiempo.
  • Los Value Objects no tienen identidad y son inmutables.
  • Los Agregados agrupan Entidades y Value Objects en una unidad lógica.
  • Buenas prácticas en DDD incluyen encapsulación, inmutabilidad y control de acceso.

Próximo paso

En la siguiente clase veremos cómo desacoplar las dependencias con interfaces y la inversión de dependencias en Clean Architecture.

Fernando Sonego

Deja una respuesta

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