リポジトリ パターンの意図を誤解していますか?
私は「ええ」と言うつもりですが、私と私が一緒に働いたすべての人が同じ理由で同じことを尋ねたことを知っておいてください... 「あなたは4次元で考えていません、マーティ」.
少し単純化して、最初に Create メソッドの代わりにコンストラクターを使いましょう。
Editor e = new Editor("Editor Name");
e = editorRepository.Add(e);
Project p = new Project("Project Name", e);
p = projectRepository.Add(p);
その下で、プロジェクト リポジトリは常に有効な所有者 ( p.EditorId
) を作成時にプロジェクト データに格納していますが、編集者のプロジェクトを再設定しても、そこに存在します。これが、必要なすべてのプロパティをコンストラクターに入れることをお勧めする理由です。オブジェクト全体を渡したくない場合は、e.Id
意志だけで十分です。
また、メンバーのエディターを遅延ロードしたい場合、プロジェクトにはリポジトリへの参照も必要ですか?
さて、エディターのプロジェクトをオンデマンドで再設定する方法については、目的に応じていくつかの選択肢があります。Straight Repository はあなたが欲しいと言います:
IEnumerable<Project> list = projectRepository.GetAllProjects()
.Where(x => x.editorId == e.Id);
しかし、どこに置くのですか?Project や Editor の中ではありません。その通りです。そうしないと、リポジトリにアクセスする必要があり、それは良くありません。上記のスニペットは疎結合ですが、単独では再利用できません。リポジトリ パターンの限界に達しました。
次はアプリケーションのアダプタ層で、リポジトリの共有ソースStaticServiceWrapper
(必要なすべてのリポジトリを流暢に。実稼働システムでこの方法を正確に行ったことはありませんが、簡潔な例を示します。
public static class Aggregators
{
// one to one, easy
public static Editor GetOwner(this Project p)
{
return StaticServiceWrapper.editorRep.GetEditorById(p.editorId);
}
// one to many, medium
public static IEnumerable<Project> GetProjects(this Editor e)
{
return StaticServiceWrapper.projectRep.GetAllProjects()
.Where(x => x.editorId == e.Id);
}
// many to many, harder
public static IEnumerable<Editor> GetMembers(this Project p)
{
var list = StaticServiceWrapper.projectMemberMap.GetAllMemberMaps()
.Where(x => x.projectId == p.projectId);
foreach ( var item in list )
yield return StaticServiceWrapper.editorRep.GetEditorById(item.editorId);
}
}
基本的に、GetAll、GetById、Add、Update、Remove オブジェクト リポジトリが完了したら、関連付けをそのままにして、オブジェクト/レイヤー階層を上に移動して、アダプターやキャッシュ、ビジネス ロジックなどの楽しい部分に移動する必要があります ( 「ああ、私の!」)。