2017-09-19 1 views
1

新しいグリーンフィールドプロジェクトでは、コマンドバスアプローチを使用していますが、遭遇する問題は関係をどのように処理すべきかです。DTOのコマンドバスアプローチとの関係を処理する方法

たとえば、Orderには複数のOrderLines、ShippingおよびInvoiceアドレスがあります。

私はコマンドバスのアプローチを使用しているので、オーダーを作成するために必要なすべての情報を保持しているコマンドバスに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

Nope。他のエンティティのIDを渡して、そのメッセージの「レシーバ」にエンティティを読み取りモデルから再水和させるだけです。 – kayess

+0

@kayessだから、私はCreateOrderユースケース、CreateOrderLineユースケース、CreateAddressユースケースなどで終わるでしょうか?コマンドが非同期に実行された場合(シーケンシャル可) –

+0

@kayess私は私が同じ行にいるとは思わない;-)コントローラを介して私はCreateOrder DTOを作成しているコマンドバスには、このDTOにも注文行などが含まれていますか、またはコマンドバスを介して異なるコマンドによって実行されるべきですか? –

答えて

3

これはトランザクションの境界によって異なります。

あなたがすべてのコマンドは、実際に、あなたを一緒にを成功するか失敗する必要があることを必要とする場合に必要なすべてのデータを大きなコマンドを持っている必要があります。

サブコマンドのいずれかが失敗し、システムがまだ有効な状態になっている場合、より大きなコマンドは必要なく、それぞれ独自のトランザクション境界を持つ何らかの種類のバッチで複数のコマンドを送信できます。

+0

あなたの答えをありがとう!ですから、注文書だけが正しい製品がある電子商取引システムの場合、OrderLine DTOの1つまたは複数のインスタンスを含むリスト/配列を保持するCreateOrder DTOが必要ですか? –

+0

@MarcoVeenendaalはい。一般に、「注文」はCRUDを使用して、例えばショッピングカートとして入力されるが、カートが充填された後、DDDを使用して動作が実施される。したがって、 'Order'集計に送られた最初のコマンドは、' addOrderItem'や 'removeOrderItem'のような以前の多くのCRUDコマンドを持つことができますが、順序の有効性をチェックする' placeOrder'でなければなりません –

2

eコマースは非常に普及しているドメインで、ここではシステムの動作のビジネス上の事柄を調べるのにもっと面白いかもしれません。注文が

  • から来るん:離れCQRSから少し移動

    、私はあなたにいくつかの「DDD-スタイル」の質問をするのでしょうか?

  • CreateOrderを意味しますか?誰がそれらを作成するのですか?
  • ショッピングカートはどうですか?それは1行で人口化されていませんか?
  • ビジネスが中断されたショッピングカートについて知る必要はありませんか?

私はオーバー簡素化問題にし、オーバーエンジニアリングソリューションをドメインからあなたを警告するでしょう...一日の終わりに

あなたの場合は、ショッピングカートを持つことになります - あなたは、おそらくにコマンドを持っていますそれに商品を追加する。これらのコマンドは非同期で発行されます。事業に意味がないので、AddShoppingCartHeaderコマンドはありません。チェックアウトすると、カートはおそらく注文に変換されます。または、タイムアウト後に破棄され、リードが作成されます。これがすべて有効な場合は、プロセスマネージャのパターン(多くのメッセージングフレームワークではSagaとも呼ばれます)を調べることをお勧めします。

関連する問題