Domain Events implementation for DDD (Domain-Driven Design). Provides IDomainEvent, IAggregateRoot, IDomainEventDispatcher and related infrastructure for event-driven domain modeling.
$ dotnet add package eQuantic.Core.DomainEventsDomain Events implementation for DDD (Domain-Driven Design) in .NET.
dotnet add package eQuantic.Core.DomainEvents
IDomainEvent - Base interface for domain events (extends IEvent from Core.Eventing)DomainEventBase - Base class for domain events with automatic EventId and OccurredAtIAggregateRoot<TKey> - Interface for aggregate roots with event sourcingAggregateRoot<TKey> - Base class for aggregate roots with domain event supportIDomainEventHandler<T> - Handler interface for domain eventsIDomainEventDispatcher - Dispatcher for domain eventspublic class OrderPlacedEvent : DomainEventBase
{
public Guid OrderId { get; }
public decimal TotalAmount { get; }
public OrderPlacedEvent(Guid orderId, decimal totalAmount)
{
OrderId = orderId;
TotalAmount = totalAmount;
}
}
public class Order : AggregateRoot
{
public override Guid Id { get; protected set; }
public decimal TotalAmount { get; private set; }
public bool IsPlaced { get; private set; }
public void Place(decimal amount)
{
TotalAmount = amount;
IsPlaced = true;
// Raise domain event
RaiseDomainEvent(new OrderPlacedEvent(Id, amount));
}
}
public class OrderPlacedHandler : IDomainEventHandler<OrderPlacedEvent>
{
public async Task HandleAsync(OrderPlacedEvent @event, CancellationToken ct)
{
Console.WriteLine($"Order {@event.OrderId} placed for ${@event.TotalAmount}");
}
}
services.AddDomainEvents();
services.AddDomainEventHandler<OrderPlacedEvent, OrderPlacedHandler>();
public class OrderRepository : IOrderRepository
{
private readonly IDomainEventDispatcher _dispatcher;
public async Task SaveAsync(Order order, CancellationToken ct)
{
// Save to database...
// Dispatch domain events
await _dispatcher.DispatchEventsAsync(order, ct);
}
}
This package integrates with:
IEvent interfaceINotification also extends IEventMIT License - See LICENSE for details.