TL;DR

  • 境界づけられたコンテキスト間のコミュニケーションには、共有フォーマットについての合意(契約)が必要である。誰が契約を決めるかは、コンテキスト間の関係性によって決まる。
  • 外部システムのモデルからドメインモデルを守るために、腐敗防止層を置く。

内容

契約と関係性

境界づけられたコンテキスト間のコミュニケーションを成り立たせるには、それぞれが共有フォーマットに合意(契約)する必要がある。その代わり、コンテキスト間は密に結合する。誰が契約を決めるかは、コンテキスト間の関係性によって決まる。

  • 共有カーネル: 2 つのコンテキストが何らかのドメイン設計を共有しているため、関係するチームが協力しなければならない関係である。たとえば、発送コンテキストと受注コンテキストが、発送先住所に同じ設計を使う場合である。受注コンテキストは住所を受け付けて検証し、発送コンテキストは同じ住所を使って荷物を発送する。ドメインイベントや DTO の定義を変えるときは、影響を受ける他のコンテキストの担当者と協議してから行う。
  • 顧客/供給者(コンシューマ駆動契約): 下流のコンテキストが、上流のコンテキストに提供してほしい契約を定義する関係である。上流のコンテキストが契約上の義務を果たす限り、2 つのドメインは独立して発展できる。たとえば、請求コンテキストが契約を定義し、受注コンテキストはその情報だけを提供する。
  • 順応者: 下流のコンテキストが、上流のコンテキストが提供する契約を受け入れる関係である。下流のコンテキストは、それに合わせて自分のドメインモデルを調整する。コンシューマ駆動契約の逆にあたる。たとえば、製品カタログが定義した契約を受注コンテキストが受け入れ、そのまま使う。

腐敗防止層

外部のシステムとやり取りするとき、使えるインタフェースがドメインモデルとまったく合わないことはよくある。そのときは、やり取りやデータを、コンテキストの中で使うのに適した形に変換する必要がある。変換しないと、外部システムのモデルに合わせようとしてドメインモデルが腐敗する。

この変換のためにコンテキスト間に追加する層を、腐敗防止層(ACL)と呼ぶ。境界づけられたコンテキストのコミュニケーションで述べた入力ゲートがこれにあたる。主な責務は、上流のコンテキストの言語と下流のコンテキストの言語の間の翻訳である。検証やデータ破損の防止は副次的なものである。

洗い出したコンテキスト間の関係は、コンテキストマップに反映する。

キーワード