我试图找出处理加载具有不同图形(相关实体)的对象的最佳方法,具体取决于它们所使用的上下文。
例如这是我的域对象的示例:
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
我说得有道理吗?我离基地很远吗?请帮忙。