使用されているコンテキストに応じて、異なるグラフ (関連するエンティティ) を持つオブジェクトの読み込みを処理する最善の方法を見つけようとしています。
たとえば、これは私のドメイン オブジェクトのサンプルです。
public class Puzzle
{
public Id{ get; private set; }
public string TopicUrl { get; set; }
public string EndTopic { get; set; }
public IEnumerable<Solution> Solutions { get; set; }
public IEnumerable<Vote> Votes { get; set; }
public int SolutionCount { get; set; }
public User User { get; set; }
}
public class Solution
{
public int Id { get; private set; }
public IEnumerable<Step> Steps { get; set; }
public int UserId { get; set; }
}
public class Step
{
public Id { get; set; }
public string Url { get; set; }
}
public class Vote
{
public id Id { get; set; }
public int UserId { get; set; }
public int VoteType { get; set; }
}
私が理解しようとしているのは、この情報の使用方法に応じて、この情報を異なる方法でロードする方法です。
たとえば、フロント ページにはすべてのパズルのリストがあります。この時点では、パズルの解決策やそれらの解決策の手順についてはあまり気にしません (これはかなり重くなる可能性があります)。私が欲しいのはパズルだけです。次のようにコントローラーからロードします。
public ActionResult Index(/* parameters */)
{
...
var puzzles = _puzzleService.GetPuzzles();
return View(puzzles);
}
後のパズル ビューでは、現在のユーザーのソリューションのみを気にします。すべてのソリューションとすべてのステップを含むグラフ全体をロードしたくありません。
public ActionResult Display(int puzzleId)
{
var puzzle = _accountService.GetPuzzleById(puzzleId);
//I want to be able to access my solutions, steps, and votes. just for the current user.
}
IPuzzleService 内では、メソッドは次のようになります。
public IEnumerable<Puzzle> GetPuzzles()
{
using(_repository.OpenSession())
{
_repository.All<Puzzle>().ToList();
}
}
public Puzzle GetPuzzleById(int puzzleId)
{
using(_repository.OpenSession())
{
_repository.All<Puzzle>().Where(x => x.Id == puzzleId).SingleOrDefault();
}
}
私のセッションは各作業単位の直後に破棄されるため、遅延読み込みは実際には機能しません。私のコントローラーにはリポジトリの概念がないため、セッション状態を管理せず、ビューがレンダリングされるまで保持できません。
ここで使用する正しいパターンは何かを理解しようとしています。サービスにさまざまなオーバーロードがありますGetPuzzleWithSolutionsAndVotes
か?GetPuzzlesForDisplayView
GetPuzzlesForListView
私は理にかなっていますか?私はベースから離れていますか?助けてください。