如何使用DTO处理与命令总线方法的关系

时间:2017-09-19 12:55:50

标签: php cqrs

在一个新的绿地项目中,我正在使用命令总线方法,我遇到的问题是我应该如何处理关系。

例如,订单有多个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;
    }
}

虽然我认为有很多正确答案,但我正在寻找最佳实践。你有什么想法?

2 个答案:

答案 0 :(得分:3)

这取决于您的交易边界。

如果您需要所有命令必须成功或失败,那么您实际上必须拥有更大的命令以及所需的所有数据。

如果任何子命令失败且系统仍处于有效状态,那么您不需要更大的命令,您可以在某种批处理中发送多个命令,每个命令都有自己的事务边界。

答案 1 :(得分:2)

电子商务是一个非常受欢迎的域名,在这里可能会有更多有趣的内容来查看您系统行为的业务内容。

稍微远离CQRS,我会问你一些“DDD风格”的问题:

  • 订单来自哪里?
  • CreateOrder的含义是什么?谁创造了它们?
  • 购物车怎么样?它不是由一行填充吗?
  • 您的公司也不需要知道中止的购物车吗?

我会警告你过度简化有问题的域并过度设计解决方案......

如果您在一天结束时会有购物车 - 您可能有命令向其添加商品。这些命令将以异步方式发出。没有AddShoppingCartHeader命令,因为它对业务没有任何意义。结账时,购物车可能会转换为订单。或者,在超时后,它将被丢弃并创建一个潜在客户。如果这一切都有效 - 您可能希望查看进程管理器模式(在许多消息传递框架中也称为Saga)。