1

Domain Driven Design について、Order と OrderLines は常に集約として見なされ、Order がルートになります。通常、注文が作成されると、それを変更することはできません。しかし、私の場合、それは可能です。代わりに、各注文には、注文を変更できるかどうかを決定する状態があります。

この場合、Order と OrderLines はどちらも独自の「集約ルート」ですか? 注文明細を更新できるようにする必要があるため、注文明細には独自のリポジトリが必要であると考えています。しかし、注文明細を取得したくなく、注文なしで永続化します。したがって、これは、Order がルートであり、注文明細行を作成するためのファクトリ メソッド (Order.CreateOrderLine(quantity, text, …) を持つ集約がまだあることを示しています。

もう 1 つの方法は、注文明細行のコレクションが変更されたときに Order を更新してから、UpdateOrder(Order) を呼び出すことです。コレクションのみを更新する必要があり、Order 自体は更新しないことを (Entity Framework を使用して) 検出する何らかの方法が必要です。どう思いますか?

4

1 に答える 1

2

注文明細は、それ自体の集約であってはならず、独自のリポジトリーを必要としません。集計は次のように設定する必要があります...

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

エンティティ フレームワークには、オブジェクトの変更を検出する機能が組み込まれています。これはここで説明されています (注文/注文明細の例で便利です): http://msdn.microsoft.com/en-us/library/dd456854.aspx

于 2011-02-14T10:30:03.537 に答える