2017-10-09 6 views
0

私はrest apiが古典的なCRUDからドメインドライブデザイン(DDD)にリファクタリングされているプロジェクトを持っています。課題の1つは、エンドポイントが同じ動詞とペイロードを使用して同じままでなければならないことです。REST API経由でDDDを使用してPOSTによる部分更新を行う方法は?

私は(私はPOST順/更新/ 1048をお持ちの場合

{ 
    "id":1048, 
    "order_total":100.11, 
    "is_paid":true, 
    "order_status":"active", 
    "items":[ 
     { 
     "id":5000, 
     "name":"baseball hat" 
     }, 
     { 
     "id":5001, 
     "name":"baseball bat" 
     } 
    ] 
} 

は今、私はPOSTを経由して完全または部分的な要求モデルを送っどこGET /受注/ 1048に戻りたとえば、次のような状況

を持っていませんPOSTは冪等ではないため、PUT要求全体モデルを常に提供するため)、提供されたデータに基づいて、特定のドメインの動作をトリガーしたい。

a)ステータスケース1を更新する。

{ 
    "id":1048, 
    "order_total":100.11, 
    "is_paid":true, 
    "order_status":"cancel", 
    "items":[ 
     { 
     "id":5000, 
     "name":"baseball hat" 
     }, 
     { 
     "id":5001, 
     "name":"baseball bat" 
     } 
    ] 
} 

b)の更新状況ケース2

{ 
    "id": 1048, 
    "order_status": "cancel" 
} 

C)更新商品ケース

{ 
    "id":1048, 
    "items":[ 
     { 
     "id":5000, 
     "name":"baseball hat" 
     } 
    ] 
} 

d)の更新状況+アイテム

{ 
    "id":1048, 
    "order_status":"cancel", 
    "items":[ 
     { 
     "id":5000, 
     "name":"baseball hat" 
     } 
    ] 
} 

私の計画は、アプリケーション層とドメイン層の内部で次のことを行うことです。

  • トリガ選択行動(複数可)
  • をトリガーするためにどの行動(複数可)を決める
  • (比較ロジックを開発する)要求本体に設けられたデータと既存のドメインのデータを比較
  • ドメインデータを取得振る舞いが有効であれば、ドメインデータ全体を保持する

これはコンマを送信していないので、実際には「DDD準備要求」ではありませんPATCHを使ってndsを呼び出すことができますが、これは私が考えることができる唯一の回避策です。私は正しいことを知っていますか?

+0

[残りのAPIとDDD](https://stackoverflow.com/questions/35700344/rest-api-and-ddd)の可能な複製 – guillaume31

+1

*「これはPATCHを使用してコマンドを送信していないので実際にはDDDではありません」 * - そのDDDはいつからですか? – guillaume31

+0

送信コマンド何を更新しようとしていますか?DDDを準備してから、処理する必要がある大量のデータを送信し、使用するコマンドを決定します。いいえ? – mko

答えて

2

あなたはありませんできないは、クライアントを変更することを考慮すると:

私の計画は、あなたがこれだけを行う場合は、次の内部のアプリケーション層とドメイン層

を行うことですアプリケーションレイヤーでは、ドメインレイヤーにドメインロジックのみが含まれている限り、DDDです。 diffアルゴリズムはドメイン層に属しません。一時的なリファクタリングファサードに属している必要があります。このファサードは、リファクタリングが完了した後に簡単に削除されるように、アプリケーションレイヤの前にさらに配置することができます。

あなたはクライアントをリファクタリングするとき/場合:あなたは(凝集体)のドメインに送信するコマンドは、RESTfulなPOSTを使用して要求か(あなたのコマンドの冪等に応じて)PUTでラップでき

。すべてのドメインコマンド(すべてのドメインエンティティではない)に対して、http://server/place/order/{orderId}のようなRESTリソースを持つことができます。

次に、そのリファクタリングファサードを削除できます。

+0

このリファクタリングが一時的なものでなければならない場合は、REST経由でドメインを更新する理想的な方法があるとお考えですか? – mko

+0

@mkoはい、 "理想"は強い言葉です、 "良い"が良いです –

+0

@mkoは一時的ではありませんが、2段階でです:バックエンドとフロントエンド –

2

コンテンツタイプが変更可能な場合は、それらを使用してコマンドに関する情報を伝え、フィールドごとの比較ではなく、コマンドに関する情報を伝えることができます。サイドノートとして

PUT /order/1048 
Content-Type:application/json;command=UpdateStatus 

https://www.infoq.com/articles/rest-api-on-cqrs

、UpdateStatusを、おそらく、コマンド名としては十分ではありません。

関連する問題