Pregunta

Dado que tengo dos Contextos limitados:

  1. Fleet MGT-Subdominio de soporte basado en Crud simple
  2. Ventas: que es mi CQRS basado en Dominio del núcleo

Cuando se produce una operación CRUD en la gestión de la flota, se debe publicar un evento que refleje la operación:

  • Aeronaves
  • Avanzado
  • Acelerado
  • etc.

Se requieren estos eventos a) para actualizar varias tablas de índice que se necesitan en el dominio de ventas yb) para proporcionar un registro de auditoría unificado.

Pregunta: ¿Hay una manera fácil de almacenar y publicar estos eventos (para el InProcessEventBus, No estoy usando NSB aquí) sin pasar por un AggregateRoot, que no necesitaría en un contexto simple.

¿Fue útil?

Solución 2

Según Pieter, el principal contribuyente de NCQRS, no hay forma de hacerlo fuera de la caja.

En este escenario, no quiero pasar por toda la ceremonia de crear y ejecutar un comando, luego cargar una raíz agregada de la tienda de eventos solo para que emita el evento.

El comportamiento es simple Crud, implementado utilizando la solución más simple posible, que en este caso específico es formularios de datos utilizando el marco de la entidad. Lo único que necesito es un evento que se publica una vez que ocurrió una transacción.

Mi solución se ve así:

// Abstract base class that provides a Unit Of Work

public abstract class EventPublisherMappedByConvention 
    : AggregateRootMappedByConvention
{
    public void Raise(ISourcedEvent e)
    {
        var context = NcqrsEnvironment.Get<IUnitOfWorkFactory>()
            .CreateUnitOfWork(e.EventIdentifier);
        ApplyEvent(e);
        context.Accept();
    }
}

// Concrete implementation for my specific domain
// Note: The events only reflect the CRUD that's happened.
// The methods themselves can stay empty, state has been persisted through
// other means anyway.

public class FleetManagementEventSource : EventPublisherMappedByConvention
{
    protected void OnAircraftTypeCreated(AircraftTypeCreated e) { }
    protected void OnAircraftTypeUpdated(AircraftTypeUpdated e) { }
    // ...
}

// This can be called from anywhere in my application, once the 
// EF-based transaction has succeeded:

new FleetManagementEventSource().Raise(new AircraftTypeUpdated { ... });

Otros consejos

Si desea publicar el evento sobre algo, este algo probablemente sea una raíz agregada, porque es un objeto identificado externamente sobre un paquete de interés, de lo contrario, ¿por qué querría hacer un seguimiento de ellos?

Teniendo eso en cuenta, no necesita tablas de índice (entiendo que estas son para consultar) en las ventas BC. Necesita los GUID de la aeronave y solo las búsquedas/se unen en el lado de la lectura.

Para auditar, solo agregaría un evento de auditoría genérica a través de la reflexión en los repositorios/unidad de trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top