簡単な答え: 永続的でリッチなドメイン オブジェクトが好きです。
長い答え:
ほぼ 10 年間、Spring と Hibernate を使用して 500k LOC のかなり大規模なシステムに取り組みました。最初は、"トランザクション スクリプト" (Fowler を参照) アプローチから始めました。これは、Hibernate を完全に信頼していなかったことが一因です。しかし、すぐに Hibernate を信頼するようになりました。かなり純粋な OO の以前のトレーニングのおかげで、ドメイン駆動設計アプローチと組み合わせた一時的な永続性を強く信じるようになりました。基本的に、私たちのシステムは ODBMS で支えられていると考えるようになりました (多くの小さなリークがあります :-))。
私たちのアーキテクチャを「ドメイン カーネル」と呼んだのは、DDD という本がまだ書かれていないからです。これは Hibernate の初期の段階であったため、ドメイン モデルは注釈で汚染されていませんでした。XML マッピングでは、持続性に関する別個の関心事が別個に保たれていました。
繰り返しになりますが、時間が経つにつれて、動作をドメイン層にプッシュダウンする方法が改善されました。コンパイル時の依存関係で強制される、かなり伝統的なコントローラー-->サービス-->dao-->ドメイン階層化スキームがありました。時間をかけて私が観察したことは、このモデルが当社のシステムで非常にうまく機能したことです。これは、プランの設定、取引、会計、コンプライアンス テスト、販売、ブランディングなどを含む、401(k) プラン管理のかなり複雑なドメインのあらゆる側面を表しています。 (比較的) 透過的な「魔法のような」永続性を備えたリッチ ドメイン モデルは、ドメイン モデルの既存の機能に関して新しい機能を構築できるようにするための鍵でした。
当社のサービス レイヤーは、技術サービス (電子メール、ファイル I/O、キューイングなど) 間の相互作用のみを調整し、必要に応じて複数のドメイン パッケージにまたがるのに役立ちました。サービス層は、(Spring を介して) トランザクション境界も定義しました。サービスは、DTO またはプリミティブのみを受信または発行しました。多くの人は、DRY の中断としてそれを嫌っていますが、サービス インターフェイスとそれらを使用するコードを定義するときに、正直でいられることがわかりました。また、後でリモート操作を行うのも非常に簡単になりました。
このアプローチにより、非常に小さなチーム (私たちはスクラム チームでした) で高品質のソフトウェアを構築することができました。
したがって、私は永続ドメイン オブジェクトの信奉者だと考えてください。私の話が役に立つかどうかわかりませんが、共有したかったのです。