TL;DR
ドメインモデルを中心に置き、すべての依存を中心に向けるアーキテクチャ。Jeffrey Palermo が 2008 年に提唱した。UI やビジネスロジックが、データアクセスなどのインフラに結合しないようにする。
なぜ必要か
Palermo によると、従来のレイヤードアーキテクチャでは、各層がその下の層に結合している。よくある問題は、UI とビジネスロジックがデータアクセスに結合していることである。データアクセスの技術はおよそ 3 年ごとに変わるので、この結合があるとアップグレードが難しくなり、システムはやがてレガシーになる。
仕組み
中心には、状態と振る舞いを合わせ持つドメインモデルを置く。そのすぐ外側の層には、オブジェクトを保存・取得するリポジトリのインタフェースだけを置く。具体的なリポジトリの実装は特定のデータアクセスの方法に結びつくので、UI、インフラ、テストと一緒に最も外側の層に置く。コアの層の数は決まっていない。
基本のルールは、どのコードも自分より中心にある層には依存してよいが、外側の層には依存してはいけない、というものである。コアは必要なインタフェースを定義し、実装は実行時に注入する(依存性逆転の原則)。データベースも中心ではなく外部にあり、アプリケーションは、コアのインタフェースを実装したインフラのコードを通してデータベースを使う。インフラを外に出してアダプタを書くという前提は、Alistair Cockburn のヘキサゴナルアーキテクチャと共通している。
注意点
Palermo は、長く使われる業務アプリケーションや、振る舞いが複雑なアプリケーションに向くとしており、小さな Web サイトには向かないとしている。