总线消息可以包含数组吗

时间:2018-10-25 14:21:49

标签: php service domain-driven-design cqrs

假设我们有一个简单的CreateOrder命令,它可以具有3个不同的“加密级别”。

透明级别:

class CreateOrder
{
    public function __construct(
        string $id,
        string $paymentMethod,
        float $paymentAmount,
        string $customerFirstName,
        string $customerLastName,
        string $billingAddressFirstName,
        string $billingAddressLastName,
        string $billingAddressStreet,
        string $billingAddressCity
        array $items // that's the only ninja
    ) {
        // setters
    }
}

此级别必须预先暴露所有可能的字段(可以达到30-50甚至更多)。唯一的未知项是项目列表,但是在没有结构的语言中,您将无法避免(除非我们同意命令可以接受值对象)。

分组级别:

class CreateOrder
{
    public function __construct(
        string $id,
        array $payment,
        array $customer,
        array $billingAddress,
        array $shippingAddress,
        array $items // that's the only ninja
    ) {
        // setters
    }
}

此级别仅接受数组,因为它们将是结构。它比较神秘,但是如果我们想在组之一中添加一个字段,则可以更轻松地进行修改。另一方面,我们必须验证是否使用了正确的密钥,当然还要编写一些文档来描述哪些字段可以接受。

最后一级-忍者:

class CreateOrder
{
    public function __construct(array $data) {
        // setters
    }
}

好吧,如果我们决定使用分组级别,我们已经可以接受忍者了,因为这是同样的问题。我们必须验证所有密钥,并写下一些文档来描述数据有效载荷可能包含的内容。

PS。 请不要指出我可以使用 AddItem 之类的单独命令将透明级别中的商品添加到订单中。假设我必须使用一个事务和一个命令来创建订单。

然后我的问题:

  • 是否有任何图案/规则/书/意见描述哪种方法是最好的?
  • 如何做出选择(这是一个非常普遍的问题,但是每次我遇到类似的问题时,我都会选择一个问题,因为只有很多选择,但没有足够严格的规则可遵循)
  • 也许我们可以使用值对象,而不是尝试仅在消息的有效负载中保留基元?
  • 但是,如果我们决定使用值对象,那么消息的有效负载(值对象)是否应该可完全序列化为基元?

0 个答案:

没有答案