W moim modelu domenowym mam: zamówienie, pozycję zamówienia i historię zamówienia. Podzieliłem więc go na dwa agregaty:
- zamówienie zawierające pozycję zamówienia (Order i OrderItem)
- historię zamówienia (OrderHistory)
Jak ktoś zmieni status zamówienia - wywołanie metody SetShippedStatus() to rzucam event OrderStatusChangedEvent:
public class Order : Entity, IAggregateRoot
{
public OrderStatus OrderStatus { get; private set; }
public List<OrderItem> OrderItems { get; private set; }
public Order()
{
Id = Guid.NewGuid();
OrderStatus = OrderStatus.New;
OrderItems = new List<OrderItem>();
}
public void SetShippedStatus()
{
OrderStatus = OrderStatus.Shipped;
AddDomainEvent(new OrderStatusChangedEvent(Id, OrderStatus));
}
}
Czy zapis do historii zmiany statusu zamówienia powinno się realizować w event handlerze dla OrderStatusChangedEvent czy też ten event handler powinien rzucać komendę 'zapisz do historii zmianę statusu' i command handler powinien ten zapis realizować?
To mój agregat do historii zmiany statusu zamówienia:
public class OrderHistory : Entity, IAggregateRoot
{
public Guid OrderId { get; private set; }
public OrderStatus OrderStatus { get; private set; }
public DateTime StatusModificationDate { get; private set; }
public OrderHistory(Guid orderId, OrderStatus orderStatus)
{
Id = Guid.NewGuid();
OrderId = orderId;
OrderStatus = orderStatus;
StatusModificationDate = DateTime.Now;
}
}