Spring+HibernateEntityManager(Spring+DDDっぽく編)

おいらは DDD っぽいのが好き。

前回は、HibernateEntityManager を使ったベタなサンプルでした。しかし、おいらは DDD っぽいのが好きなので、今回は DDD(Domain-Driven-Design)っぽい設計にしてみます。

Layered Architecture

ソースコードを、DDD の階層アーキテクチャにあわせて分離しました。maven レベルで別アーティファクトにするもしくはサブモジュールにしたほうがよいと思いつつ、メンドイのでとりあえず eclipse プロジェクトのソースフォルダレベルで分離。

プレゼンテーション層

今回は、この階層は使用しません。DB に保存するだけのサンプルなのでw

アプリケーション層

アプリケーションを構成するための層です。ドメインモデルは業務問題領域のモデルであり、ドメインモデル中の各エンティティやサービス等がアプリケーションとしてどのように構成されるかという視点は存在しません。Singleton インスタンスの作成や Unit of Work の設定やアプリケーションの初期化等、アプリケーションという視点はこの層で扱います。

  • ソースフォルダは application/src
  • パッケージは application
ドメイン

業務問題領域を扱うための層です。「業務問題領域を扱うアプリケーション」という視点は全くなく、「業務問題領域そのもの」を扱うことに注意です。

  • 仕様ソースフォルダは domain-api/src
  • 実装ソースフォルダは domain-impl/src
  • パッケージは、上記両方とも domain
インフラストラクチャ層

アプリケーション層やドメイン層から利用される層です。CoreJ2EE パターンの階層アーキテクチャと混同して、ここをEIS層と勘違いしている例を結構多く見受けますが(Domain-Driven-Design の本家のフォーラムですら多くの人が勘違いしてますから o...rz)、あくまでも、アプリケーション層やドメイン層から利用される層です。

  • 仕様ソースフォルダは infrastracture-api/src
  • 実装ソースフォルダは infrastracture-impl/src
  • パッケージは、上記両方とも infrastracture
参考


Spring+HibernateEntityManager(Spring+DDDっぽく編 その2) に続く。