Я пытаюсь выяснить, как лучше всего обрабатывать загрузку объектов с помощью различных графиков (связанных объектов) в зависимости от контекста их использования.
Например, вот пример моих доменных объектов:
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
?
Имею ли я смысл? Я далеко от базы? Пожалуйста, помогите.