私はWebアプリケーションの基本アーキテクチャを設計しているところです。ビジネスモデルとロジックが非常に複雑であるため、プロジェクトはドメイン駆動設計アプローチに従います。
このプロジェクトは、 SOAプロジェクト(サービス指向アーキテクチャー)を目指しています。だから私はサービスとそれを中心にプロジェクトを構築する方法について多くを学んでいます。
私の前の質問に続いて、モデルクラスの関連付けに関する質問があります。
モデルクラスは永続性に関連することを知り、何もするべきではないことを理解しています。ただし、モデルクラス間の関連付けがある状況を判断するのに問題があります。
例えば:
- クラス
Person
- クラス
Car
には1つのドライバーがあります(例)
getDriver
とはどこにあるべきgetCars
ですか?
- モデルクラス:
$car->getDriver()
- プリミティブ型のサービスレイヤー:
$personService->getPerson($car->getDriverId())
- OOPを使用したサービスレイヤーで:
$carService->getDriver($car)
解決策1.より自然なようです。Doctrine 2を使用しているので、モデルの関連付けはDBマッピングアノテーションで処理されます。そうすれば、モデルは永続性に関連することは何もしません(実際にはDoctrineを介して行いますが)。それは私のお気に入りの解決策ですが、最初に「車」のリストをロードすることを除いて、サービスのポイントは何ですか?
解決策2.OOPを破棄し、モデル/サービスユーザーが関連付けをフェッチするためにデータベースモデルについて知っている必要があるため、愚かなようです(このIDが「個人」IDであることを知っている必要があります)。そして、彼は自分で協会をしなければなりません。
ソリューション3はソリューション2よりも少し優れていますが、それでもOOPはどこにありますか?
だから、私にとっては解決策1が最高です。しかし、私はソリューション2とソリューション3が実際のプロジェクトで使用されているのを見たことがあります(時には一緒に混合されることもあります)ので、疑問があります。
また、次のような追加のパラメータがある場合、質問はより複雑になります。
$person->getCars($nameFilter, $maxNumberOfResults, $offset);
(この場合、実際にはSQLクエリ/永続クエリのように見えます)
では、ドメイン駆動設計アプローチに従ったプロジェクトのモデル/サービスアーキテクチャに使用する必要があるのはどれですか?SOAの場合、モデルはロジックのない「ダム」データコンテナのみにする必要がありますか?もしそうなら、DDDアプローチはどこにありますか?