シリアライズコードとワークフローの連携
LT;DR
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
シリアライズされる方法をこちらでコントロールするのが大事