0001 — 厳密なDDDと純粋なCore
コンテキスト
このアプリは実際のお金を動かします。ビジネスルールがエンドポイント、バックグラウンドサービス、Razorコンポーネントに散在すると、テスト不可能で矛盾した動作に腐敗します。ちょうどそこでバグはユーザーの資本を失わせます。
決定
ドメインロジックはsrc/Coreのアグリゲート、値オブジェクト、ドメインサービス上に存在し、ゼロのインフラストラクチャ依存性(EF、HttpClient、Docker、ASP.NETなし)でコンパイルされます。エンドポイント、MCPツール、コンポーネント、BackgroundServiceはオーケストレートします。決して決定しません。ルール:
- 公開セッターなし。状態変更は不変性を保護する意図を明確にするメソッドを通じて。
- アグリゲートは強いIDで相互参照し、ナビゲーションプロパティでは参照しない。
- 1つの
SaveChangesは1つのアグリゲートを変更。クロスアグリゲートフローはドメインイベントを使用。 - ドメイン境界を超える原始型は値オブジェクトでラップ。
- 不変性違反は、フレームワーク例外ではなく、Core
DomainExceptionをスロー。
結果
- ドメインルールは、データベースやウェブホストなしでユニットテスト可能。
Coreの純粋性はArchitectureGuardTestsによって機械的に実行され、破られた場合はビルド失敗。- 貧血性モデルよりは多くセレモニーがあります(値オブジェクト、強いID、ドメインイベント)。これはお金を動かすルールを正確に保ち、1つの場所に保つための意図的なコストです。