cartId のようなものがあり、カート内のアイテム、配送先住所、支払い先住所などを更新している場合はどうでしょうか。ここで、DDD カートを使用すると、ルート オブジェクトである必要があり、アイテム、配送先住所、および支払いが子である必要があります。リクエストは、カートと依存オブジェクトを受け取る必要があります。
DDD と HTTP/REST を混同しないでください。DDD はドメイン用です。HTTP/REST は Web リソース用です。
なぜこのようなものではないのですか?
add product to the cart
POST /my/carts/1/products { body/model: productId=6&quantity=2 }
update quantity
PUT /my/carts/1/products/6 {body/model: quantity=4 }
...そして、私はあなたの DDD 設計について議論しなければなりません。配送先住所と請求先住所は、カートの集計ではなく、実際には注文の集計の一部です。しかし、私は脱線します...
HTTP リソースを編成して DDD 集計を模倣する場合、各リクエストでカート全体を渡す必要はありません。さまざまなユーザー アクションで、さまざまなリソース/メソッドの組み合わせを呼び出して、集計を操作することができます。リクエストの本文と一緒に cartId を送信する必要さえありません。これはすでに URL に含まれているためです。
[POST("my/carts/{cartId:int}/products")]
public HttpResponseMessage PostProduct(int cartId, CartProductPostModel model)
{
// ensure user owns the cart (based on cookie or authentication info)
// get the cart aggregate based on the cartId,
// add the product to the cart
// tell the client you succeeded by passing back an appropriate response
// 201 Created
// Location: http://www.site.com/my/carts/1/products/6
// note the response does not send back the whole cart, it only tells you
// the new resource was created and where you can access it
}
HTTP リソース URL を RESTful に設計する場合、ヘッダー、Cookie、セッションなどで ID を渡す必要はありません。これは、必要なすべての情報が既に要求に含まれているためです (URL 自体またはいずれか)。リクエスト本文で。
アップデート
したがって、この場合、cartId は整数ではなく、実際には "/" を含む文字列です (IIS/ASP.net MVC は失敗します)。私は奇妙だと知っていますが、それはそれであり、私はそれを変更することはできません. したがって、URL の一部として存在することはできません。クエリ文字列の一部である可能性があります。ただし、他のクライアントと相互運用するには。私たちはそれをクッキーに入れることを余儀なくされています。
はい、URLに入れることができます。最初にエンコードするだけです。したがって、次のようなカート IDcart/with/slashes
は、URL で次のようになります。
add product to the cart
POST /my/carts/cart%2fwith%2fslashes/products
update quantity
PUT /my/carts/cart%2fwith%2fslashes/products/6
これは、MVC ルーティングでも WebAPI ルーティングでも問題なく機能します。
[POST("my/carts/{cartId}/products")]
public HttpResponseMessage PostProduct(string cartId, CartProductPostModel model)
{
// cartId will be "cart/with/slashes", decoded
}