今回のC#でドメイン駆動開発で採用するアーキテクチャーに関して説明します。アーキテクチャーとはプログラム設計の枠組みでC#では参照関係を定義することでコーディングを制限します。参照できるプロジェクトと出来ないプロジェクトの依存関係を定義することでコーディングに制限をつけて異なる思想でできるだけコーディングできないようにします。
アーキテクチャーについて
階層化アーキテクチャー
ドメイン駆動開発は当初「階層化アーキテクチャー」が推奨されていました。
- ユーザーインターフェース層,
- アプリケーション層,
- ドメイン層,
- インフラストラクチャー層。
すべては下位層にのみ依存します。ユーザーインターフェースは画面部分,アプリケーションはドメインと画面を調整する薄い層(ファサードに近い?もしくわMVCのコントローラーに近い?)。
ドメイン層はビジネスロジックの置き場所。システム全体の定義域。
インフラストラクチャーは外部との接触部分(データベースとの接触部分など)のロジックを書きます。
しかしこの依存関係ではインフラでドメイン定義を参照できず,不自由が生じます。そこでドメイン層を最上位にしたアーキテクチャーが推奨されています。これを依存関係逆転等といいますが,詳しいことは置いておきます。
ヘキサゴナルアーキテクチャー
階層化アーキテクチャーの進化系?かどうかはわかりませんが,概念的にはヘキサゴナルアーキテクチャーが現状もっともよいというか,ドメイン駆動開発を表しているといわれています。
六角形のヘキサゴンを中心に何かが突き刺さっているイメージです。ドメインを中心にインフラ層はSQLServerが刺さっているかもしれないし,テストデータが刺さっているかもしれないという状態です。
UIに関してもWinFormかもしれないしWPFかもしれないといった感じです。
ドメイン層を定義してそれ以外の技術的要素をその外に書くといったイメージです。
つまりインフラ層にはSqlserverとの接触部分をコーディングしますが,それ以外のことは記述しません。大事な業務ロジックはドメイン層に書きます。
UI層も同様にUIに関連することのみを書きます。今回UI層はWinFormで書いていきますが,WinFormをWPFに置き換えるとして,書き換えないといけない部分だけをUI層に書くと思ってください。
それ以外の部分はドメイン層に書きます。