Proxy パターンを使用して遅延読み込みを実装する例を次に示します。
モデルの残りの部分と共存する Person クラス。子は仮想としてマークされているため、PersonProxy クラス内でオーバーライドできます。
public class Person {
public int Id;
public virtual IList<Child> Children { get; set; }
}
残りのリポジトリと共存する PersonRepository クラス。このクラスに子を取得するメソッドを含めましたが、必要に応じて ChildRepository クラスに含めることもできます。
public class PersonRepository {
public Person FindById(int id) {
// Notice we are creating PersonProxy and not Person
Person person = new PersonProxy();
// Set person properties based on data from the database
return person;
}
public IList<Child> GetChildrenForPerson(int personId) {
// Return your list of children from the database
}
}
リポジトリと一緒に存在する PersonProxy クラス。これは Person から継承し、遅延読み込みを行います。Children == null かどうかを確認する代わりに、ブール値を使用して、既に読み込まれているかどうかを確認することもできます。
public class PersonProxy : Person {
private PersonRepository _personRepository = new PersonRepository();
public override IList<Child> Children {
get {
if (base.Children == null)
base.Children = _personRepository.GetChildrenForPerson(this.Id);
return base.Children;
}
set { base.Children = value; }
}
}
あなたはそのようにそれを使うことができます
Person person = new PersonRepository().FindById(1);
Console.WriteLine(person.Children.Count);
もちろん、PersonRepository を直接呼び出したくない場合は、PersonProxy に PersonRepository へのインターフェイスを取り込ませ、サービスを介してすべてにアクセスさせることができます。