作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 DDD 重构一个项目,但我担心不会让太多实体成为他们自己的聚合根。
我有一个 Store
,其中包含 ProductOption
的列表s 和 Product
的列表s。一个 ProductOption
可以多人使用Product
s。这些实体似乎适合 Store
聚合得很好。
然后我有一个 Order
,暂时使用 Product
建立它的OrderLine
s:
class Order {
// ...
public function addOrderLine(Product $product, $quantity) {
$orderLine = new OrderLine($product, $quantity);
$this->orderLines->add($orderLine);
}
}
class OrderLine {
// ...
public function __construct(Product $product, $quantity) {
$this->productName = $product->getName();
$this->basePrice = $product->getPrice();
$this->quantity = $quantity;
}
}
class OrderLine {
// ...
public function __construct(Product $product, $quantity) {
$this->productName = $product->getName();
$this->basePrice = $product->getPrice();
$this->quantity = $quantity;
// store this information, but don't use it in any method
$this->product = $product;
}
}
最佳答案
即使它用于“仅报告”,仍然有业务/领域的含义。我觉得你的设计很好。虽然我不会通过存储 OrderLine -> Product
来处理新的需求引用。我会做一些类似于您已经在产品名称和价格方面所做的事情。您只需要在订单行中存储某种产品标识符( SKU ?)。此标识符/SKU 稍后可以在查询中使用。 SKU 可以是 Store 和 Product 自然键的组合:
class Sku {
private String _storeNumber;
private String _someProductIdUniqueWithinStore;
}
class OrderLine {
private Money _price;
private int _quantity;
private String _productName;
private Sku _productSku;
}
这样您就不会违反任何聚合规则,并且可以安全地删除产品和商店,而不会影响现有或存档的订单。而且您仍然可以拥有“来自 StoreY 的 ProductX 订单”。
关于domain-driven-design - DDD : keep a link to an entity inside an aggregate root, 仅用于报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429515/
我是一名优秀的程序员,十分优秀!