Per aggregare o no - ordine / ordine ordinato
-
13-11-2019 - |
Domanda
Informazioni su Domain Driven Design, Order e Orderlines sono sempre visti come un aggregato, dove l'ordine è la radice. Normalmente, una volta creato un ordine, non si può cambiarlo. Nel mio caso, tuttavia, è possibile. Invece ogni ordine ha uno stato che determina se l'ordine può essere modificato o meno.
In questo caso, sono entrambi ordini e ordinano la propria "radice aggregata"? Devo essere in grado di aggiornare le linee di ordine, quindi immagino che dovrebbero avere il proprio repository. Ma non voglio recuperare le linee d'ordine e persiste senza l'ordine. Quindi questo indica che c'è ancora un aggregato in cui l'ordine è la radice con un metodo di fabbrica per creare linee dell'ordine (ordine.Createorderline (quantità, testo, ...).
Un altro approccio potrebbe essere quello di aggiornare l'ordine quando la raccolta delle linee dell'ordine è stata modificata, quindi chiamare l'aggiornamento (ordine). Avrei bisogno di un modo per rilevare che solo la collezione dovrebbe essere aggiornata e nessun ordine stesso (usando il quadro di entità). Cosa ne pensi?
Soluzione
Le linee d'ordine non dovrebbero essere un aggregato di ciò, e non ha bisogno del proprio repository.Il tuo aggregato dovrebbe essere impostato qualcosa del genere ...
public class Order
{
private List<OrderLine> _orderLines;
private OrderState _orderState;
public IEnumerable<OrderLine> OrderLines
{
get { return _orderLines.AsReadOnly();}
}
public OrderState Status
{
get { return _orderState; }
}
public void DeleteOrderLine(Guid orderLineID)
{
if (Status.IsProcessed)
throw new InvalidOperationException("You cannot delete items from a processed order");
OrderLine lineToRemove = _orderLines.Find(ol => ol.Id == orderLineID);
_orderLines.Remove(lineToRemove);
}
public void AddOrderLine(Product product, int quantity)
{
if (Status.IsProcessed)
throw new InvalidOperationException("You cannot add items to a processed order");
OrderLine line = new OrderLine(product.ProductID, (product.Price * quantity), quantity);
_orderLines.Add(line);
}
}
.
Quadro di entità ha alcune funzionalità integrate per rilevare le modifiche al tuo oggetto.Questo è spiegato qui (convenientemente con un esempio di ordine / ordine di ordine): http://msdn.microsoft.com/en-us/library/dd456854.aspx