簡體   English   中英

將實體添加到DDD中的聚合根的正確方法

[英]Proper way to add an entity to an aggregate root in DDD

我有一個稱為Order的聚合根,我需要在Order添加一個Product

public class Order {
  public void AddProduct(Product p) {
  }
}

我想問一下DDD准則。 我面臨兩個問題:

  1. Product具有兩個屬性,其中包括: Product.OrderIDProduct.Order DDD在調用 Order.AddProduct 之前應設置以下哪個屬性?

  2. 還是我需要 Order.AddProduct設置這兩個屬性Order.AddProduct ,例如“ p.Order = this ”;

請注意,我以“ Order和“ Product ”為例。 有人告訴我這種關系可能不合適。 謝謝。

讓聚合創建實體。 對於客戶來說,這是最簡單的解決方案,因為“創建”和“添加產品”沒有分開。

public class Order 
{
   private readonly List<Product> _products = new List<Product>();

   public Product CreateProduct(string name, Price price) 
   {
      var product = new Product(new ProductId(), name, price);
      _products.Add(product);

      return product;
   }
}

請注意, CreateProduct的簽名可能會根據您的需要而有所不同。 例如,在某些情況下,您將需要從客戶端提供ID,而在其他情況下,訂單將為產品生成ID。

注意:您可能應該具有Product和OrderItem或ProductOrderItem實體。 OrderItem是將添加到Order中的實體。 當您編輯產品時,OrderItems將不會被修改。

我建議使用工廠方法。 這里是一個例子:

public class Order {
    public Product addProduct(
        ProductId aProductId, 
        String aDescription 
    ) {
        Product product = new Product(
            this.orderId
            aProductId, 
            aDescription
        )

        //Publish event ProductWasAddedToOrder(this.orderId, aProductId) 

        return product;
    }
} 

然后,如果需要,可以讓訂戶(觀察員模式)偵聽NewItemWa⚓ToOrder事件,例如,它可以顯示添加到購物車中的項目或類似的內容。

更新 :我犯了一個大錯誤,因為我混淆了術語。 當我考慮產品時,我正在想象一個訂單商品,它不存在,並且是在向訂單中添加新元素時創建的,我認為這是最好的方法。

想象一下,在訂單中保存了ProductId(對產品的引用),另一方面,訂購該產品的客戶為此支付了20歐元。 兩個月后,系統管理員更改了同一產品的價格,由於您在訂單中保存了對該產品的引用,因此如果您要查看當天客戶支付的金額,則可以得到新的價格。 將產品保存在訂單中,每當您修改產品時,您也在修改訂單。

因此,我將向該訂單添加一個新商品,其中包含該商品當時具有的特定信息。 該項目還應包含對產品的引用,以了解給定特定產品已創建了多少個項目。 這里的例子:

public class Order {
    public OrderItem addItem(
        OrderItemId anItemId, 
        ProductId aProductId, 
        Price aPrice, 
        String aDescription 
    ) {
        OrderItem orderItem = new OrderItem(
            anItemId, 
            this.orderId,
            aProductId,
            aDescription, 
            aPrice
        )

        //Publish event NewItemWasAddedToOrder(this.orderId, anItemId) 

        return orderItem;
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM