在一个新的绿地项目中,我正在使用命令总线方法,我遇到的问题是我应该如何处理关系。
例如,订单有多个OrderLines,一个送货和发票地址。
由于我使用命令总线方法,我想将DTO传递给我的命令总线,其中包含创建订单所需的所有信息。
此命令是否也包含关系(即CreateOrderTask,CreateOrderAddress)?
我的目录/文件结构如下所示:
- Infrastructure
-- Ui
--- Web
---- CreateOrderController.php
-- ....
- Application
-- CreateOrder
--- CreateOrder.php
--- CreateOrderHandler.php
--- CreateOrderLine.php (?)
- Domain
-- Order
--- Order.php
--- OrderLine.php
--- Address.php
-- ...
CreateOrder类应该如下所示:
// CreateOrder.php
<?php
class CreateOrder {
/** @var CreateOrderLine[] */
protected $createOrderLines;
public function __construct(array $createOrderLines)
{
$this->createOrderLines = $createOrderLines;
}
public function getCreateOrderLines()
{
return $this->createOrderLines;
}
}
虽然我认为有很多正确答案,但我正在寻找最佳实践。你有什么想法?
答案 0 :(得分:3)
这取决于您的交易边界。
如果您需要所有命令必须成功或失败,那么您实际上必须拥有更大的命令以及所需的所有数据。
如果任何子命令失败且系统仍处于有效状态,那么您不需要更大的命令,您可以在某种批处理中发送多个命令,每个命令都有自己的事务边界。
答案 1 :(得分:2)
电子商务是一个非常受欢迎的域名,在这里可能会有更多有趣的内容来查看您系统行为的业务内容。
稍微远离CQRS,我会问你一些“DDD风格”的问题:
CreateOrder
的含义是什么?谁创造了它们?我会警告你过度简化有问题的域并过度设计解决方案......
如果您在一天结束时会有购物车 - 您可能有命令向其添加商品。这些命令将以异步方式发出。没有AddShoppingCartHeader
命令,因为它对业务没有任何意义。结账时,购物车可能会转换为订单。或者,在超时后,它将被丢弃并创建一个潜在客户。如果这一切都有效 - 您可能希望查看进程管理器模式(在许多消息传递框架中也称为Saga)。