DDD - zapis historii zamówienia

0

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;
    }
}
2

A jaki w ogóle ma sens osobny agregat dla historii zamowienia?

0

Nad tym też się zastanawiałem czy historia nie powinna być częścią agragatu zamówienie - sugerujesz żeby zapisywać historię przy okazji zapisywania zamówienia bez rzucania eventu?

0
  1. Jeśli to jest agregat to IMO sporo eventów Ci brakuje, jak to jest bounded context to też jest złe podzielenie tego w ten sposób (zamówienie "zna" swoje możliwości)
  2. Zmiksowałeś CQRS/ES do zabawy zamówieniami, w ogóle nie wiadomo czy ten tandem tu pasuje + ja mam wątpliwości czy w ogóle samo ES tu pasuje. Jakie masz oczekiwania względem użycia ES w czymś co wygląda w działaniu jak crud?
0

@wiewiorek: nie wczytywałem się w Twój kod i idee, ale jak dla mnie to raczej nie może istnieć historia zamówienia bez zamówienia podobnie jak pozycja zamówienia. Nie jestem specem od DDD ale dla mnie historia powinna być częścią agregatu zamówienia.

0
TurkucPodjadek napisał(a):
  1. Jeśli to jest agregat to IMO sporo eventów Ci brakuje, jak to jest bounded context to też jest złe podzielenie tego w ten sposób (zamówienie "zna" swoje możliwości)
  2. Zmiksowałeś CQRS/ES do zabawy zamówieniami, w ogóle nie wiadomo czy ten tandem tu pasuje + ja mam wątpliwości czy w ogóle samo ES tu pasuje. Jakie masz oczekiwania względem użycia ES w czymś co wygląda w działaniu jak crud?

Dałem tylko wycinek klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1