사용되는 컨텍스트에 따라 다른 그래프 (관련 엔터티)를 사용하여 개체를로드하는 가장 좋은 방법을 파악하려고합니다. 내가 이해하기 위해 노력하고있어다른 그래프를 사용하여 개체를로드하는 올바른 패턴 찾기
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);
}
을 나중에 현재 사용자 만이 솔루션에 대해 내가 지금 관심 퍼즐보기를. 모든 솔루션과 모든 단계를 전체 그래프로로드하고 싶지는 않습니다. 내 IPuzzleService 내부
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.
}
, 내 방법은 다음과 같이 :
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
)?
나는 의미가 있습니까? 나는 기지에서 벗어나나요? 도와주세요.
내 마음이 약간 희미하다. 나는 이것이 당신에게 의미가 있고 약간의 가치를 제공하기를 바랍니다. – JoshBerke
세션이 GetPuzzle ... X() 메소드의 끝 부분에서 범위를 벗어날 때 게으르지 않습니다. 그것은 처분된다. 프록시가 항목을 나중에 가져 오려고하면 "세션이 이미 삭제되었습니다."오류가 발생합니다. – Micah