TL;DR
- 境界づけられたコンテキストの間は、ドメインイベントを使って疎結合にコミュニケーションする。
- コンテキスト間で渡すデータは DTO に変換してシリアライズする。コンテキストの境界には入力と出力の「ゲート」を置く。
内容
ドメインイベントによるコミュニケーション
境界づけられたコンテキストの間では、ドメインイベントを使ってコミュニケーションを行う。これにより、上流のコンポーネント(受注)と下流のコンポーネント(発送)は互いを意識せずに済む。自律的なコンポーネントを実現するには、このような疎結合が重要である。
ドメインイベントを具体的にどう送るかは、選ぶアーキテクチャによって異なる。コンポーネントのデプロイ形態と同じく(自律的なソフトウェアコンポーネントとしての境界づけられたコンテキスト)、この時点で決める必要はない。キューでも関数呼び出しでも、コンポーネントが疎結合になりさえすればよい。
イベント(OrderPlaced)をコマンド(ShipOrder)に変換するハンドラは、下流のコンテキストの一部にしてもよい。インフラストラクチャの一部として、別の Message Router やプロセスマネージャが実行することもできる。
コンテキスト間のデータ転送
コンテキスト間のコミュニケーションに使うイベントは、下流のコンポーネントがそのイベントを処理するのに必要な情報をすべて持っている(第11章 Serialization)。
渡すデータオブジェクトは、コンテキスト内で定義されたドメインオブジェクトと似ているが、同じではない。コンテキスト間のインフラストラクチャの一部として、シリアライズして共有するように設計されたものであり、DTO(データ転送オブジェクト)にあたる。上流のコンテキストの境界では、ドメインオブジェクトを DTO に変換し、DTO を JSON や XML にシリアライズする。下流のコンテキストでは、その逆を行う。
信頼の境界と検証
境界づけられたコンテキストの内側にあるものは信頼でき、有効である。しかし、外側にあるものは信頼できない。そこで、ワークフローの最初と最後に「ゲート」を置く。
- 入力ゲート: 入力がドメインモデルの制約に合っているかを常に確認する。
- 出力ゲート: コンテキスト間の偶発的な結合を避けるためと、セキュリティのために、非公開の情報がコンテキストの外に漏れないようにする。