リポジトリパターンを使用するときに、複雑なオブジェクトグラフの遅延読み込みの問題を適切に処理する方法を考えています。これは私が推測するORM固有の問題ではありません。
初挑戦:
public interface IProductRepository : IRepository<Product>
{
Product GetById(int id);
IProductRepository WithCustomers();
}
これは問題なく機能しますが、常に自分自身を繰り返す必要があります(あらゆる場所のリポジトリ実装でカスタムの「With」メソッドを作成します)。
次のアプローチ:
public interface IRepository<T> where T : IAggregateRoot
{
...
void With(Expression<Func<T, object>> propToExpand);
}
With
メソッドは、必要なエンティティを取得するときにどの小道具を熱心にロードする必要があるかを見つけるために後で使用されるプライベートコレクションにアイテムを追加します。
この種はうまくいき、大丈夫です。しかし、私は使用法が嫌いです:
productRepository.With(x=>x.Customer);
productRepository.With(x=>x.Price);
productRepository.With(x=>x.Manufacturer);
var product = productRepository.GetById(id);
基本的に-問題は連鎖がないことです。私はそれをこのようにしたいと思います:
var product = productRepository
.With(x=>x.Customer)
.With(x=>x.Price)
.With(x=>x.Manufacturer)
.GetById(id);
私はこれを達成できませんでした。できたとしても、そのソリューションがエレガントかどうかはわかりません。
これは、私が基本的な何かを見逃しているという考えにつながります(どこにも例がない)。これを処理するさまざまな方法はありますか?ベストプラクティスは何ですか?