14

遅延読み込みの例を数多く見てきましたが、どれを選択しますか?

たとえば、モデルクラスが与えられた場合:

public class Person
{
    private IList<Child> _children;
    public IList<Child> Children
    {
        get {
            if (_children == null)
                LoadChildren();
            return _children;
        }
    }
}

Person クラスは、その子がどのように読み込まれるかについて何も知らないはずです....またはそうすべきですか? 確かに、プロパティがいつ入力されるかを制御する必要がありますか?

Person をその子コレクションと結合するリポジトリがありますか、または遅延ロードクラスを使用するなどの別のアプローチを使用しますか?

最初に Person を要求してからその子を要求する場合 (つまり、このインスタンスでは遅延読み込みではない)、または何らかの方法で遅延読み込みを行う場合、パフォーマンスをどのように処理しますか。

これはすべて個人の選択に帰着しますか?

4

7 に答える 7

0

ここで関連する質問をしましたが、Immutability&ThreadSafetyタックの方が重かったです。良い答えとコメントがたくさん。あなたはそれが役に立つと思うかもしれません。

于 2009-03-18T02:56:44.040 に答える
0

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 へのインターフェイスを取り込ませ、サービスを介してすべてにアクセスさせることができます。

于 2014-01-31T02:01:02.007 に答える