私はドメイン駆動設計 (DDD) にかなり慣れていませんが、私が理解しているのは、「モデル」への入り口であるアプリケーション サービスと対話するということです。このサービスは、ソース (ファイル、データベースなど) を使用してデータを取得するリポジトリと通信できます。リポジトリはエンティティを返します。
それが私が得たグローバルな考えです。サービスはリポジトリを認識していますが、エンティティなどは認識していません。
今、私は次の問題を抱えています。
次のようなエンティティ ユーザーがいます (単なる例です)。
<?php
class User
{
protected $name;
protected $city_id;
public function getCity()
{
// return $city_entity;
}
}
getCity() 関数は都市エンティティを返します。この関数で遅延読み込みを使用したいので、ユーザー リポジトリを使用するときに CityEntity を挿入することは、実際には遅延読み込みではありません。
私は問題に対する2つの解決策を思いつきました。しかし、私はどちらも DDD の原則に反していると感じています。
私が思いついた最初の解決策は、シティ リポジトリをユーザー エンティティに挿入することです。これには欠点があります。さらにリポジトリが必要な場合は、それらすべてをエンティティにロードする必要があります。答えのように見えますが、リポジトリのラッパーのように見えます。それでは、なぜリポジトリを注入しないのでしょうか?
2 番目の解決策は、エンティティにサービス ロケーターを提供することです。これの欠点は、コードを読まないと、どのリポジトリが必要かがわからないことです。
さて、問題は、DDD プリンシパルをそのまま維持しながら、遅延読み込みの柔軟性を提供する最善の方法は何かということです。