20:54 0 0
Eventos de dominio

Eventos de dominio

  DrUalcman |  abril 162024
EventosDominio.jpg

Podríamos decir que en una arquitectura de software hay principalmente 2 tipos de eventos de dominio:

  • Eventos de Integración
  • Eventos de Dominio

Aunque el primero, parece no ser un evento de dominio, también se localiza como evento de dominio dentro de una arquictura orientada al dominio como DDD por ejemplo.

Eventos de Integración

En la arquitectura de software, un evento de dominio (también conocido como mensaje de evento de dominio o simplemente un evento) es un concepto importante en el diseño dirigido por el dominio (DDD, por sus siglas en inglés). Representa algo que ha sucedido en el dominio del que el sistema es responsable. Aquí tienes una explicación más detallada:

Aspectos clave de los eventos de dominio:

  1. Contexto del Diseño Dirigido por el Dominio (DDD): En DDD, el enfoque está en el dominio central y la lógica que lo impulsa. Los eventos de dominio ayudan a capturar y comunicar ocurrencias significativas dentro del dominio.
  2. Representación de Eventos Significativos: Un evento de dominio representa un evento significativo que ha ocurrido dentro del dominio. Por ejemplo, en un sistema de comercio electrónico, los eventos podrían incluir "PedidoRealizado", "PagoProcesado" o "ProductoEnviado".
  3. Inmutable y Histórico: Los eventos de dominio son inmutables, lo que significa que una vez creados, no pueden cambiarse. Representan algo que ya ha sucedido y, por lo tanto, sirven como un registro histórico.
  4. Comunicación entre Contextos Delimitados: Los eventos de dominio se utilizan a menudo para comunicarse entre diferentes contextos delimitados dentro de un sistema. Esto puede ser dentro de la misma aplicación o a través de diferentes servicios en una arquitectura de microservicios.
  5. Manejo de Eventos: Cuando ocurre un evento de dominio, puede desencadenar varias acciones o flujos de trabajo. Los manejadores de eventos o suscriptores escuchan estos eventos y ejecutan la lógica de negocio correspondiente. Esto desacopla la lógica que genera el evento de la lógica que maneja el evento.
  6. Event Sourcing: En la obtención de eventos, el estado de una entidad se deriva de una serie de eventos de dominio en lugar de un estado actual. Esto proporciona una pista de auditoría completa y permite reconstruir el estado reproduciendo eventos.

Ejemplo de un Evento de Dominio:

Considera un sistema de comercio electrónico donde se puede realizar un pedido. Cuando se realiza un pedido, se puede publicar un evento PedidoRealizado.

public class PedidoRealizado : IDomainEvent
{
    public Guid PedidoId { get; }
    public DateTime FechaPedido { get; }
    public string ClienteId { get; }
    public List Items { get; }
    public PedidoRealizado(Guid pedidoId, DateTime fechaPedido, string clienteId, List items)
    {
        PedidoId = pedidoId;
        FechaPedido = fechaPedido;
        ClienteId = clienteId;
        Items = items;
    }
}

Beneficios de Usar Eventos de Dominio:

  1. Desacoplamiento: Los productores de eventos están desacoplados de los consumidores. El productor no necesita saber quién manejará el evento.
  2. Escalabilidad: Permite que los sistemas escalen al manejar eventos de manera asincrónica y distribuir las cargas de trabajo.
  3. Flexibilidad: Se puede agregar nueva funcionalidad simplemente suscribiéndose a eventos existentes sin cambiar el código que genera los eventos.
  4. Auditabilidad: Proporciona una pista de auditoría clara de lo que ha sucedido en el sistema.

Implementación de Eventos de Dominio:

  1. Generación de Eventos: Las entidades de dominio generan eventos cuando sucede algo significativo.
  2. Publicación de Eventos: Los eventos se publican típicamente en un bus de eventos o intermediario de mensajes.
  3. Manejo de Eventos: Los manejadores de eventos escuchan los eventos y ejecutan la lógica de negocio en respuesta.

Ejemplo de Flujo de Trabajo:

  1. Servicio de Pedidos: Cuando se realiza un pedido, el OrderService genera un evento PedidoRealizado.
  2. Bus de Eventos: El evento se publica en un bus de eventos.
  3. Manejadores de Eventos: Diferentes servicios se suscriben al evento PedidoRealizado y realizan acciones como actualizaciones de inventario, envío de correos electrónicos de confirmación, etc.

Al usar eventos de dominio, los sistemas pueden diseñarse para ser más modulares, mantenibles y escalables, lo que facilita la gestión de la lógica de negocio compleja y las interacciones dentro del dominio.

Eventos de Dominio

 Cuando el evento es solo dentro de la misma parte del software, todavía se llama un evento de dominio. Los eventos de dominio se preocupan principalmente por capturar y reflejar ocurrencias significativas dentro de un único contexto delimitado o agregado. Vamos a profundizar en cómo funcionan los eventos de dominio dentro de una sola parte del software:

Eventos de Dominio dentro de un Único Contexto Delimitado

En este escenario, los eventos de dominio se utilizan para:

  1. Capturar Eventos Significativos de Negocio: Representan ocurrencias importantes dentro del dominio, como "ClienteRegistrado" o "ItemAñadidoAlPedido".
  2. Mantener la Lógica de Negocio y el Estado: Aseguran que todas las reglas de negocio y lógica necesarias se ejecuten cuando ocurre un evento, manteniendo la integridad y consistencia del dominio.
  3. Desacoplamiento de la Lógica de Negocio: Ayudan a desacoplar diferentes partes de la lógica de negocio dentro del mismo contexto delimitado. Por ejemplo, realizar un pedido puede desencadenar varios procesos como verificaciones de inventario, envío de correos electrónicos de confirmación y registro del evento.

Ejemplo de Manejo de Eventos de Dominio dentro de un Contexto Delimitado

1. Generación de un Evento de Dominio:

En un modelo de dominio típico, las entidades o agregados generan eventos de dominio cuando ocurren cosas significativas.

public class Pedido
{
    public Guid Id { get; private set; }
    public DateTime FechaPedido { get; private set; }
    public List Items { get; private set; }
    
    // Lista para almacenar eventos de dominio
    private List _eventosDominio = new List();
    public IReadOnlyCollection EventosDominio => _eventosDominio.AsReadOnly();
    public void AñadirItem(ItemPedido item)
    {
        Items.Add(item);
        _eventosDominio.Add(new ItemAñadidoAlPedido(Id, item));
    }
    // Método para limpiar eventos de dominio después de haber sido procesados
    public void LimpiarEventosDominio() => _eventosDominio.Clear();
}

2. Clase de Evento de Dominio:

Una clase de evento de dominio representa el evento.

public class ItemAñadidoAlPedido : IDomainEvent
{
    public Guid PedidoId { get; }
    public ItemPedido Item { get; }
    public ItemAñadidoAlPedido(Guid pedidoId, ItemPedido item)
    {
        PedidoId = pedidoId;
        Item = item;
    }
}

3. Manejo de Eventos de Dominio:

Los manejadores de eventos de dominio procesan los eventos.

public class ItemAñadidoAlPedidoHandler : IDomainEventHandler
{
    public void Handle(ItemAñadidoAlPedido eventoDominio)
    {
        // Implementar la lógica de negocio para manejar el evento
        // Por ejemplo, actualizar el inventario, registrar el evento, etc.
        Console.WriteLine($"Item añadido al pedido: {eventoDominio.PedidoId}");
    }
}

4. Procesamiento de Eventos de Dominio:

Un servicio o repositorio puede ser responsable de procesar los eventos de dominio.

public class PedidoService
{
    private readonly IPedidoRepository _pedidoRepository;
    private readonly IDomainEventDispatcher _eventDispatcher;
    public PedidoService(IPedidoRepository pedidoRepository, IDomainEventDispatcher eventDispatcher)
    {
        _pedidoRepository = pedidoRepository;
        _eventDispatcher = eventDispatcher;
    }
    public void AñadirItemAlPedido(Guid pedidoId, ItemPedido item)
    {
        var pedido = _pedidoRepository.GetById(pedidoId);
        pedido.AñadirItem(item);
        _pedidoRepository.Save(pedido);
        
        // Despachar eventos de dominio
        foreach (var eventoDominio in pedido.EventosDominio)
        {
            _eventDispatcher.Dispatch(eventoDominio);
        }
        // Limpiar eventos de dominio después de despacharlos
        pedido.LimpiarEventosDominio();
    }
}

public class DomainEventDispatcher : IDomainEventDispatcher
{
private readonly IServiceProvider _serviceProvider;

public DomainEventDispatcher(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}

public void Dispatch(TDomainEvent domainEvent) where TDomainEvent : IDomainEvent
{
var handlers = _serviceProvider.GetServices>();

foreach (var handler in handlers)
{
handler.Handle(domainEvent);
}
}
}

Beneficios de Usar Eventos de Dominio dentro de un Contexto Delimitado:

  1. Encapsulación: Los eventos de dominio ayudan a encapsular la lógica de negocio dentro de los agregados, haciendo el modelo más robusto y mantenible.
  2. Desacoplamiento: Permiten que diferentes partes del modelo de dominio reaccionen a eventos sin estar estrechamente acopladas.
  3. Consistencia: Aseguran que todas las acciones necesarias relacionadas con un evento de negocio se ejecuten, manteniendo la consistencia del modelo de dominio.
  4. Testabilidad: Los eventos de dominio facilitan la prueba de la lógica de negocio al permitir simular eventos y verificar que los manejadores apropiados sean invocados.

En resumen, los eventos de dominio dentro de un único contexto delimitado capturan y manejan ocurrencias significativas de negocio, promoviendo una separación de preocupaciones clara y mantenible dentro del modelo de dominio.

Conclusiones
Recordar que esto es solo una forma de hacer las cosas, y que el codigo es desde ChatGpt por falta de tiempo, me atrase y tenia que hacer 5 blogs de meses pendientes, pueden haber otras implementaciones o formas de hacer esto.

Happy Coding

0 Comentarios

 
 
 
EventosDominio.jpg

Archivo