предметно-ориентированный дизайн-дизайн агрегат.дочерняя сущность как совокупность в другом БК - PullRequest
0 голосов
/ 19 февраля 2019

Есть два ограниченных контекста.Одним из них является контекст заказа, а другим - контекст получения.

В контексте заказа у заказа есть несколько позиций заказа.В заказе должна быть хотя бы одна позиция заказа.В контексте квитанции квитанция имеет некоторые позиции заказа, а не заказ.

По этой причине я думаю, что позиция заказа должна рассматриваться как совокупная.

Существует несколько кодов, подобных приведенным ниже

public class Order
    {
        List<OrderItem> orderItems = new List<OrderItem>();
        public OrderId Id { get; }

        public void AddItem(Item item, Quantity quantity)
        {
            orderItems.Add(new OrderItem(item, quantity));
        }
    }

    public class OrderItem
    {
        public ItemId ItemId { get; }
        public Quantity Quantity { get; }
    }

    public class Receipt
    {
        List<ReceiptItem> receiptItems = new List<ReceiptItem>();
        public ReceiptId Id { get; }
        public void AddItem(OrderItem orderItem)
        {
            receiptItems.Add(new ReceiptItem(orderItem));
        }
    }

    public class ReceiptItem
    {
        public ReceiptItem(OrderItem orderItem)
        {
            ItemId = orderItem.ItemId;
            Quantity = orderItem.Quantity;
        }
        public ItemId ItemId { get; }
        public Quantity Quantity { get; }
        //some other properties
    }

    public class OrderService
    {
        public void CreateOrder(int[] itemIds, decimal[] quantities)
        {
            Order order = new Order();
            for (int i = 0; i < itemIds.Length; i++)
            {
                Item item = itemRepository.FindById(itemIds[i]);
                order.AddItem(item, quantities[i]);
            }
            orderRepository.Add(order);
        }
    }

    public class RecieptService
    {
        public void CreateReceipt(int[] orderItemIds)
        {
            Receipt receipt = new Receipt();
            foreach (var orderItemId in orderItemIds)
            {
                //To find orderItem I implemented orderItemRepository. 
                OrderItem orderItem = orderItemRepository.FindById(orderItemId);
                receipt.AddItem(orderItem);
                //Or should I implement order repository like this
                //Order order = orderRepository.FindWhichHasOrderItem(orderItemId);
                //valueobject orderItem = orderItemDtoorder.FindOrderItem(orderItemId);
                //receipt.AddItem(orderItem);
            }
            receiptRepository.Add(receipt);
        }
    }

OrderItem должен быть с заказом как дочерний объект при его создании, поэтому orderItem должен быть доступен только по заказу.Но на OrderItem нужно ссылаться при создании квитанции.Я боролся с этой проблемой в течение нескольких дней, но все же я не решил ее DDD.Пожалуйста, дайте мне знать, как разработать это требование в DDD.

...