2017-09-19 44 views
1

在一個新的新建項目我使用的是命令總線的方式,問題我遇到是我應該如何處理人際關係處理與命令總線方式的關係。如何使用DTO的

例如,一個訂單有多個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; 
    } 
} 

雖然我認爲有很多正確答案,我在尋找一個最佳實踐。你怎麼看?

+1

沒有。只需傳遞其他實體的ID,並讓該消息的「接收者」重新使用read-model中的實體。 – kayess

+0

@kayess所以我最終會得到一個CreateOrder用例,CreateOrderLine用例,CreateAddress用例等等?如果命令是異步執行的(這可以解決課程) –

+0

@ kayess我不認爲我們在同一行;-)通過我的控制器我會創建一個CreateOrder DTO,我將它傳遞到命令總線,這個DTO是否也包含命令行等,或者應該通過命令總線執行不同的命令? –

回答

3

這取決於您的交易邊界。

如果您需要所有的命令都必須成功或失敗一起,那麼你實際上必須與所需的所有數據有一個更大的命令

如果任何一個子命令失敗,系統仍處於有效狀態,那麼你並不需要一個更大的命令,你可以在某種批發送多個命令,每一個有它自己的事務邊界。

+0

感謝您的回答!因此,在電子商務系統中,如果訂單隻有正確的訂單才具有產品,那麼我應該有一個CreateOrder DTO,它包含一個具有一個或多個OrderLine DTO實例的列表/數組? –

+0

@ MarcoVeenendaal是的。通常,使用CRUD填充「訂單」,例如作爲購物車,但購物車完成填充後,將使用DDD執行行爲。因此,發送給Order集合的第一個命令應該是檢查訂單有效性的placeOrder,儘管您可能有許多先前的CRUD命令,例如addOrderItem或removeOrderItem。 –

2

電子商務頗爲流行域,這裏可能有更多有趣的看你的系統的行爲,哪些業務的事情。

移動遠離CQRS一點點,我會問你一些「DDD式」的問題:

  • 來自哪裏的順序?
  • 什麼CreateOrder是什麼意思?誰創造它們?
  • 購物車怎麼樣?它不是由一條線填充?
  • 您的企業是否也需要了解有關流產的購物車?

我會過度簡化的問題和領域過度工程解決方案警告你......

如果在一天結束時將有一個購物車 - 你可能要命令添加商品。這些命令將被異步發佈。將不會有AddShoppingCartHeader命令,因爲它對業務沒有任何意義。在結帳時,購物車可能會轉換爲訂單。或者,在超時後,它將被丟棄並創建一個潛在客戶。如果這一切都是有效的 - 你可能會想看看進程管理器模式(在很多消息框架中也被稱爲Saga)。