ワークフローの入力
入力としてのコマンド
https://scrapbox.io/files/668383067a07ad001c6621b5.png
コマンドは、PlaceOrder(注文を確定する)とする
このコマンドは、ワークフローがリクエストを処理するために必要な情報をすべて内包している必要がある
UnvalidatedOrder
code:fsharp
type UnvalidatedOrder =
{ OrderId: string
CustomerInfo: UnvalidateCustomerInfo
ShippingAddress: UnvalidatedAddress }
また、今回はメタデータを記録・監査のために追跡したいので、以下のように型を定義する
メタデータ
誰がコマンドを作成したか
もちろんこれらは仕様による(必須ではない) radish-miyazaki.icon
code:fsharp
type PlaceOrder =
{ OrderForm: UnvalidatedOrder
TimeStamp: DateTime
UserId: string }
ジェネリクスによる共通構造の共有
e.g.
タイムスタンプ
ユーザ ID
共有のフィールドを含む 基底クラス を定義し、各コマンドはそれを継承することで解決できる code:fsharp
type Command<'data> = {
Data: 'data
TimeStamp: DateTime
UserId: string
}
type PlacedOrderCommand = Command<UnvalidatedOrder>
複数のコマンドを 1 つの型にまとめる
https://scrapbox.io/files/669d03b8609fd8001c2fafbc.png
この場合、これらをシリアライズする 1 つのデータ構造に統一する必要がある
複数のコマンドから 1 つを選択するため、選択型 を用いる code:fsharp
type OrderTakingCommand =
| Place of PlaceOrder
| Change of ChangeOrder
| Cancel of CancelOrder
https://scrapbox.io/files/669d04b38021a1001d2f9a16.png