Curso de Refactorización hacia Domain-Driven Design
Aprende a rescatar un proyecto legacy combinando las técnicas de refactorización y Domain-Driven Design
¿Crees que es muy tarde para que tu aplicación se beneficie de aplicar las técnicas de Domain-Driven Design, Arquitectura Hexagonal y CQRS?
Conocer y aplicar los principios del paradigma de Domain-Driven Design para escribir aplicaciones mantenibles en colaboración con los expertos de dominio.
Conocer y aplicar los patrones arquitectónicos que soportan una implementación exitosa de Domain Driven Design, como rich domain model, ports and adapters y los building blocks del modelo de dominio.
Identificar la lógica de negocio acoplada de un proyecto legacy en forma de modelo anémico y separarla usando value objects y service layer hacia un modelo rico.
Evitar el acoplamiento con la base de datos usando el patrón repositorio.
Desacoplar diferentes bounded context (in-process o remotos) mediante eventos de dominio.
Cómo identificar los invariantes del dominio y determinar las fronteras entre los agregados en consecuencia.
Antes de comenzar...
¿Qué es (y qué no es) Domain-driven Design?
Las 3 claves del DDD: Colaboración, Modelado e Incremental
Diseño táctico y diseño estratégico
El antipatrón Modelo de Dominio Anémico
¿Qué es la encapsulación?
¿Qué son los invariantes?
Ejemplo de invariantes: Cuadrado
Ejercicio: Identificación de invariantes
¿Por qué es importante preservar los invariantes?
Relación entre modelo anémico y encapsulación
Ventajas de un modelo anémico: ¿Cuándo usarlo?
Modelos anémicos y bounded contexts
La regla Tell Don't Ask
Introducción al bloque de value objects y validación
¿Qué es un value object? Inmutabilidad e intercambiabilidad
Ejemplos de value objects y entidades: Dirección, Número de tarjeta bancaria, Factura, Referencia de factura
Importancia de usar value objects
¿Cómo identificar value objects?
Ejercicio: identificar y crear value objects
Ejemplo con C# de la librería CSharpFunctionalExtensions para implementar ValueObjects
Solución: Identificar y crear value objects
¿Qué es la validación de datos?
Estrategias de validación: Always valid domain model y validación funcional
Ejercicio: Implementar reglas de validación con ResultT
¿Qué es un agregado?
Normas para implementar agregados
¿Cómo escoger fronteras entre agregados?
Relación entre CRUD y agregados
Heurísticas para identificar agregados
Heurísticas para diseñar agregados
Ejercicio: Identificación de agregados
¿Qué son los Eventos de Dominio?
Características de los Eventos de Dominio
Ventajas de usar Eventos de dominio
Vivimos en un mundo de consistencia eventual
Elevar vs despachar eventos
Eventos de dominio vs eventos de integración
Ejemplo: Elevando eventos de dominio en C#
Despachando eventos de dominio
Ejemplo: Despachando eventos de dominio en C# con EntityFramework
Protegerse de errores al despachar los eventos: Patrón Transactional Outbox
Consistencia semifuerte en transacciones distribuidas: Patrón Saga
Precio regular