MVC3을 실행중인 프로젝트가 있습니다. LINQ를 사용하여 데이터베이스에서 데이터를 가져옵니다. MVC3과 함께 제공되는 예전의 예제와 동일한 아키텍처 디자인으로 프로젝트를 만들었습니다. 이러한 프로젝트에서는 응용 프로그램이 분리되어 있으며이 항목에서는 Model.cs 파일에 중점을두고 자합니다. 지금은 각 컨트롤러마다 하나씩 가지고 있습니다. 예를 들어, HighscoreController.cs와 HighscoreModels.cs가 있습니다. 모델 클래스에서 나는 datacontext에 대한 참조를 가진 Service 클래스와이 datacontext를 사용하여 데이터베이스를 쿼리하는 몇 가지 메소드를 정의한다. 이제는 이러한 메서드 중 일부가 동일한 쿼리를 실행한다는 문제가 발생하여 데이터베이스에 대한 중앙 액세스 지점을 만들어서 리포지토리 패턴을 구현할 것이라고 생각했습니다.MVC, 저장소 패턴 및 DataLoadOptions
private IRepository _repository;
public HighscoreService()
: this(new Repository())
{ }
public HighscoreService(IRepository repository)
{
_repository = repository;
}
지금 데이터베이스 호출이 저장소 내에서 처리하고 저장소 서비스 클래스에서 사용됩니다 그래서 대신에 서비스 클래스의 데이터 컨텍스트에 대한 참조를 갖는 지금과 같은 저장소에 대한 참조가 _repository 참조를 통해.
내 저장소는 다음과 같이 내장되어 있습니다 :이 저장소 패턴과 함께 DataLoadOptions를 사용하려고하면
는public class Repository : IRepository
{
private MyDataContext _dataContext;
public Repository()
{
_dataContext = new MyDataContext();
}
public Member MemberByName(string memberName)
{
Member member = CompiledQueries.MemberByName(_dataContext, memberName);
return member;
}
}
내가 직면 문제가 나타납니다.
dataloadoptions를 사용할 때 새로운 dataloadoptions가 적용되기 전에 datacontext에 대한 이전 쿼리를 작성하지 않아야합니다. 그리고 내 저장소는 모든 메소드에서 datacontext를 재사용하므로 전혀 작동하지 않습니다. 필자는 2 가지를 시도해 왔습니다. 하나는 using 문을 사용하여 datacontext를 매번 새로 고치는 방법으로 모든 메소드 내에서 datacontext를 재생성하는 것입니다. 하지만 저장소에서 결과를 가져 와서 내 모델로 다시 가져 왔고 사용 문이 끝나면 저장소 패턴 내에서 범위가 부족할 때 문제가 발생합니다. 즉 결과가 예를 들어 사용할 수 없다는 것을 의미합니다. 나에게 데이터를 제공 한 datacontext가 종료 되었기 때문에 .Count() 또는 .ToList(). 또한 전체 저장소에서 동일한 datacontext를 사용하는 다른 솔루션을 시도했지만 dataloadoptions를 사용하는 각 메서드에서 새 인스턴스를 만듭니다. 이 느낌이 매우 더러운;) 그래서 누구나 저에게 저장소 패턴과 함께 DataLoadOptions를 사용하는 방법에 대한 제안을 줄 수 있습니까? 방금 설명한 문제를 피하십시오. 아니면 dataloadoptions를 사용하지 말고 다른 방법을 선택해야합니까? DataLoadOptions를 사용하는 이유는 관련 테이블에서 일부 데이터를 가져 오려고하기 때문입니다.
약간의 질문으로 : 위의 코드 예제에서 CompiledQueries를 자체의 .cs 파일 내에 배치 한 것을 볼 수 있습니다. 이것은 나쁜 디자인입니까? MVC 응용 프로그램에 컴파일 된 쿼리를 넣을 위치에 대한 지침이 있습니까?
미리 양해 해 주셔서 감사합니다. 내 질문에 대한 답변이 몇 개 있기를 바랍니다.) 미리 감사드립니다. 더 많은 정보가 필요하면 그냥 물어보십시오.
저는 전문가는 아니지만 "요청 범위"에 데이터 컨텍스트를 유지하는 아이디어가 도움이 될 것이라고 생각합니다. 이렇게하면 HTTP 요청마다 새로운 컨텍스트가 만들어져 일부 문제가 제거 될 수 있습니다. Ninject와 같은 IoC 컨테이너가이를 지원할 수 있습니다. Entity Framework를 참조하는 동안 다음 게시물이 도움이 될 수 있습니다. http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/ – ngm
저장소 및 설정을 주입하십시오. perWebRequest와 같은 라이프 스타일. 쓸모없는 추상화 레이어를 추가하는 것을 제외하고 저장소가 여러분을 위해 무엇을하고 있는지 확실하지 않습니다. – CrazyCoderz