ORMを使用したDDDのビジネスロジックはどこに行くべきですか?


10

私は過去にMDA(モデル駆動型アーキテクチャ)ツールを使用しましたが、UMLを介してモデル化し、これにより、とりわけビジネスエンティティ(ドメインモデル)とORM(マッピングなど)が生成されました。

ドメインで動作するビジネスコードとサービスの多くはモデルの一部であり、リポジトリはビジネスエンティティを返していました(そのため、別のORMに切り替えることはできませんでした(望んでいなかった))。

しかし、今はプロジェクトを始めており、DDDについて考えたいと思います。

これまでのところ、ビジネスロジックをドメインモデルに入れ、リポジトリを介してORM(どちらを選択した場合でも)で作業するように感じています。ただし、アプリケーションのORM部分に引き続きMDAツールを使用したい場合、ここで作成されたモデルは非常に貧弱です(つまり、ビジネスロジックが含まれていません)。同様に、ORMにエンティティフレームワーク(.net)またはNHibernateを使用した場合、それも貧血モデルになります。NHibernateをそのまま使用した場合、ビジネスロジックをどこに置くかわかりません。

私はこのように考えるのは正しいですか、つまりDDDではドメイン内のすべてのビジネスロジックを使用し、リポジトリ経由で永続化するためにORMを使用するだけですか?

回答:


12

したがって、別のORMに切り替えることは不可能でした(私たちが望んでいたことではありません))。

それは間違っているようです。リポジトリパターンの主な利点は、データアクセスロジックを非表示にし、簡単に交換できることです。

これまでのところ、ビジネスロジックをドメインモデルに入れ、リポジトリを介してORM(どちらを選択した場合でも)で作業するように感じています。ただし、アプリケーションのORM部分にMDAツールを引き続き使用したい場合、ここで作成したモデルは非常に貧弱です(つまり、ビジネスロジックが含まれていません)。同様に、ORMにエンティティフレームワーク(.net)またはNHibernateを使用した場合、それも貧血モデルになります。NHibernateをそのまま使用した場合、ビジネスロジックをどこに置くかわかりません。

貧血ドメインモデルは、マーティンファウラーなど、多くの人にとって悪い習慣と見なされています。このようなモデルは、優れたオブジェクト指向の設計ではなく、手続き型の設計手法につながるため、このような設計は避けてください。次に、データクラスとマネージャー/処理クラスがあり、状態と動作を分離します。しかし、オブジェクトは実際には「状態動作」でなければなりません。

NHibernateは永続性の無知で素晴らしい仕事をします。XMLまたはFluentNHibernateを使用してマッピングの詳細を非表示にして、単純なPOCOを作成できます。NHibernateを使用してリッチドメインモデルを作成するのは非常に簡単です。エンティティフレームワークとMDAツールでもそれができると思います。このツールが部分クラスを生成する限り、新しい世代がユーザー作成コードを破壊することを心配する必要なく、生成されたコードをかなり簡単に拡張できます。

この長い話を短くするために。NHibernateを使用するとき、何も繰り返さないので、リッチドメインモデルを採用できなくなります。FluentNHibernateで使用し、手動でマッピングすることをお勧めします。マッピングコードの記述には、5〜10分しかかかりません。エンティティフレームワークについても同じことが当てはまり、そのツールは少なくとも簡単に拡張できる部分クラスを作成すると思います。

私はこのように考えるのは正しいですか、つまりDDDではドメイン内のすべてのビジネスロジックを使用し、リポジトリ経由で永続化するためにORMを使用するだけですか?

ほとんどの場合、あなたは正しいです。リッチドメインモデルが必要です。特に、物事がますます複雑になると、適切に設計すると、保守や拡張が容易になります。ただし、DDDは、ビジネスロジックを実装する(ドメインレイヤーとアプリケーションレイヤー)サービス、および作成ロジックをカプセル化するファクトリーも認識していることに注意してください。

また、ビジネスロジックをドメインロジックと実際のアプリケーションビジネスロジックに区別する傾向もあります。ドメインロジックは、ドメインがどのように相互作用して動作するかであり、アプリケーションロジックは完全に異なるレイヤーであり、特定のユースケース/アプリケーションでドメインがどのように使用されるかをカプセル化します。多くの場合、特定のユースケースをサポートし、より強力にするために、ドメインモデルを更新する必要があります。


2
+1:また、ドメインロジックレイヤーをアプリケーションロジックレイヤーから分離します。私はすべてのORMとデータベースをドメインロジックレイヤーに配置しました。アプリケーションロジックレイヤーは、ORM、トランザクション、その他すべてについて何も認識していません。ビジネスロジッククラスのみを認識し、それらのメソッドを呼び出します。このアプローチは、よりシンプルでクリーンなアプリケーションロジックレイヤーを作成するのに非常に効果的です。
Giorgio

@ファルコン:情報をありがとう。DDDを使用してドメインを作成する場合の意味は貧血モデルについて述べたとき、私のリポジトリの1つのバージョンは、エンティティをmdaエンティティ(貧血モデル)に移動して永続化するだけのmdaバージョンになる可能性があります。これは大丈夫でしょうか?MDAツールを使用するつもりはありませんが、必要な場合はどうすればよいか理解しようとしています。これは正しい音ですか?
JD01 2011

@ JD01:よくわかりませんが、簡単に永続化できるようにドメインモデルエンティティを変換したいようです。これは、DTOとオートマッパー(google it)を使用するのとよく似ています。このようなアプローチは、必ずしもDDDのベストプラクティスを妨げるものではありません。結局のところ、リポジトリはデータアクセスロジックを非表示にすることも目的としています。背後にあるビジネスオブジェクトをMDA DTOに変換して永続化するだけで、APIユーザーは気付かないでしょう。大丈夫だと思います。
Falcon

1
@ JD01:次のリンクを見て、エンタープライズJavaの担当者の数を確認することをお勧めします。基本的に、DAO、DTO、BO(ビジネスオブジェクト)があります。私にとっては、レイヤーが多すぎますが、デザインはまあまあです。java.sun.com/blueprints/corej2eepatterns/Patterns/...
ファルコン

@ファルコン:はい、私はMTOオブジェクトであるDTOの流れに沿って考えていました。DDDプレーヤーの各部分の内容を把握しているだけです。もう一度ありがとう。
JD01 2011

3

ただし、アプリケーションのORM部分に引き続きMDAツールを使用したい場合、ここで作成されたモデルは非常に貧弱です(つまり、ビジネスロジックが含まれていません)。

どのMDAツールを使用しているかはわかりませんが、これまで使用したMDAツールでは常に部分クラスを作成しているので、必要なだけのビジネスロジックで自由にそれらを完了することができます。

ただし、MDAツールはORMよりもDDDコンテキストでは少し適切ではないと思います。コード生成では、期待される合理化された明確に表現されたドメインエンティティではなく、ツール固有のノイズで混乱したクラスが生成される傾向があるためです。実際、頻繁に得られるのは、ドメインデータ、永続化ロジック、制約検証ロジックの組み合わせです。ほとんどのMDAツールでこれらの懸念を分離する方法があるかどうかはわかりません。

そしてもちろん、部分クラスを除いて生成されたコードに触れることはできません。つまり、統合される可能性のある潜在的なDDD防止動作を排除することはできません。これは、アグリゲート間に厳密なバリアを適用し、エンティティ間の関係を完全に調整したいというアプローチでは問題になります。継続的インテグレーション環境でのビルド時間も、追加のコード生成ステップの影響を受ける可能性があります。

それとは別に、Falconはほとんどすべてを言っていると思います-ORMまたはMDAツールでは絶対に、リッチドメインエンティティを作成できません。


こんにちは。capableobjects.comのECO(エンタープライズコアオブジェクト)を使用しています。
JD01

1

私のチームでは、オブジェクトとドメインをモデル化し、同時にビジネスロジックを追加しています。モデルからコードを生成するモデル駆動型開発を使用していませんが、注釈アプローチを好みます。つまり、クラス図のオブジェクトレベルでORMステレオタイプを追加します。これにより、EJB3 / hibernateと互換性のある永続アノテーションがコードに直接追加されます。データベースの作成はHibernateによって行われ、UMLテンプレートでは行われません。コードが変更され、追加されたアノテーションがHibernateスペシャリストのものと完全に一致しない場合、彼/彼女はそれを変更できますが、モデルはまだ良いので、これははるかに優れています。要件を変更することもできますが、ドメインモデルはまだ問題ありません。

開発者は各メソッド内にビジネスロジックを追加してコメントを追加できます。また、制約をモデル化して追加することもできます。たとえば、売上高が50kを超えている場合などです。コード化する必要はありませんが、モデルに書き込むだけで、この情報は開発者チームに表示されます。本当にクールで柔軟なUML。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.