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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top