シリアライズコードとワークフローの連携
from DMMF: Serialization
LT;DR
シリアライズ は ワークフロー の前、デシリアライズ はワークフローの後に繋げる
DTO は他の境界づけられたコンテキストからの コマンド (ドメインイベント)をフォーマットしたもの
https://scrapbox.io/files/668383067a07ad001c6621b5.png
変更する際には慎重であるべき
そのためには、DTO の管理をライブラリに任せるのではなく、自分たちで行うべき
シリアライズされる方法をこちらでコントロールするのが大事
hr.icon
ワークフロー の前に デシリアライズ ステップを、後に シリアライズ ステップを追加する
e.g.
以下のようなワークフローを考える
code:fsharp
type MyInputType = ...
type MyOutputType = ...
type Workflow = MyInputType -> MyOutputType
このとき、デシリアライズステップのシグネチャは以下のようになる
https://scrapbox.io/files/669081c9e18ed9001c349f2c.png
code:fsharp
type JsonString = string
type MyInputDto = ...
type DeserializeInputDto = JsonString -> MyInputsDto
type InputDtoToDomain = MyInputDto -> MyInputType
同様に、シリアライズステップのシグネチャは以下のようになる
https://scrapbox.io/files/66908228c271b4001cfb3b9a.png
code:fsharp
type MyOutputDto = ...
type OutputDtoFromDomain = MyOutputType -> MyOutputDto
type SerializeOutputDto = MyOutputDto -> JsonString
これらの関数は、1 本のパイプラインでつながる
code:fsharp
let workflowWithSerialization jsonString =
jsonString
|> deserializeInputDto // JSON から DTO
|> inputDtoToDomain // DTO から ドメインオブジェクト
|> workflow // ドメインのコアワークフロー
|> outputDtoFromDomain // ドメインオブジェクト から DTO
|> serializeOutputDto // DTO から JSON
インフラストラクチャ層 に公開される関数
境界づけられたコンテキスト間の契約としての DTO
ワークフローが受け取る コマンド は、他の 境界づけられたコンテキスト の出力(ドメインイベント)によってトリガされる
このコマンドが、他の境界づけられたコンテキストの入力になる
https://scrapbox.io/files/668383067a07ad001c6621b5.png
このドメインイベントとコマンドによって、これらの境界づけられたコンテキストが従うべき 契約 の形が決まる
境界づけられたコンテキスト間の契約
ただし、境界づけられたコンテキスト間の 密結合 は避けたいので厳しいものではない
それでも、DTO を変更する際に慎重であるべきである
DTO はコマンドのシリアライズされたフォーマットであり、他のコンテキストに影響を及ぼしうるため?? radish-miyazaki.icon
そのためには、DTO の管理は自分たちでする必要がある
ライブラリの黒魔術に任せてはダメ
warning.icon「シリアライズライブラリを使うな」ということではない radish-miyazaki.icon
シリアライズされる方法をこちらでコントロールするのが大事
実際、シリアライズの全体例 では Newtonsoft.Json を使っている