Cześć,
od pewnego czasu zgłębiam powyższy temat i o ile w teorii wszystko wydaje się piękne o tyle w praktyce podczas implementacji już nie.
Załóżmy poniższy model realizujący logikę BoundedContext: OrderManagement
class Order : AggregateRoot
{
private readonly List<OrderItem> _items = new List<OrderItem>();
public IEnumerable<OrderItem> Items => _items;
public void AddProduct(Product product, int quantity)
{
_items.Add(new OrderItem(product, quantity));
}
public void DeleteProduct(Product product)
{
var item = _items.First(i => i.Product == product);
_items.Remove(item);
}
}
class OrderItem
{
public Product Product { get; }
public int Quantity { get; }
internal OrderItem(Product product, int quantity)
{
Product = product;
Quantity = quantity;
}
}
class Product
{
public int AvailableQuantity { get; }
public int AvailableQuantityMax { get; }
}
Jedno z wymagań do powyższego modelu to:
- aktualizacja dostępnych sztuk produktu (AvailableQuantity) podczas dodawania, usuwania i edycji pozycji zamówienia.
Pierwotnie myślałem o dwóch metodach w encji Product o zakresie internal, które to odpowiednio zmieniają ilość dostępnych sztuk produktu.
Metody te chciałem wykorzystywać z poziomu AggregateRoot podczas AddProduct, DeleteProduct
Problemy pojawiły się podczas implementacji repozytorium dla AggregateRoot w zakresie operacji usuwania pozycji zamówienia oraz całego zamówienia.
Pod pojęciem usuwanie mam na myśli trwałe usunięcie tych danych z bazy danych (zostawmy dyskusję czemu lepiej nie kasować a oznaczać flagą).
Usuwając pozycję zamówienia tracę dostęp do obiektu Product, który to musi w warstwie persystencji zostać zapisany.
Jak powinienem zaimplementować taką fikcjonalność pamiętając o persistence ignorance?