[英]Proper way to add an entity to an aggregate root in DDD
我有一個稱為Order
的聚合根,我需要在Order
添加一個Product
:
public class Order {
public void AddProduct(Product p) {
}
}
我想問一下DDD
准則。 我面臨兩個問題:
Product
具有兩個屬性,其中包括: Product.OrderID
和Product.Order
。 就DDD
, 在調用 Order.AddProduct
之前應設置以下哪個屬性?
還是我需要在 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.