MVC + 3 계층; ViewModel이 어디에서 사용됩니까?


11

ASP.NET MVC 4를 사용하여 3 계층 응용 프로그램을 설계하고 있습니다. 다음 리소스를 참조로 사용했습니다.

나는 지금까지 다음과 같은 것을 가지고있다.

프리젠 테이션 레이어 (PL) (주 MVC 프로젝트 MMVC는 데이터 액세스 레이어로 이동했다)

MyProjectName.Main
    Views/
    Controllers/
    ...

비즈니스 로직 계층 (BLL) :

MyProjectName.BLL
    ViewModels/
    ProjectServices/
    ...

데이터 액세스 계층 (DAL) :

MyProjectName.DAL
    Models/
    Repositories.EF/
    Repositories.Dapper/
    ...

이제 PL은 BLL을 참조하고 BLL은 DAL을 참조합니다. 이 방법으로 하위 계층은 위의 계층에 의존하지 않습니다.

이 디자인에서 PL은 BLL의 서비스를 호출합니다. PL은 뷰 모델을 BLL로 전달할 수 있고 BLL은 뷰 모델을 PL로 다시 전달할 수 있습니다.

또한 BLL은 DAL 계층을 호출하고 DAL 계층은 모델을 BLL로 되돌릴 수 있습니다. BLL은 View Model을 빌드하고 PL로 되돌릴 수 있습니다.

지금 까지이 패턴은 저에게 효과적이었습니다. 그러나 일부 ViewModels에서 여러 엔터티에 조인이 필요한 문제가 발생했습니다. 일반 MVC 접근 방식에서는 컨트롤러에서 LINQ 쿼리를 사용하여을 수행 join한 다음 을 수행했습니다 select new MyViewModel(){ ... }. 그러나 이제는 DAL에서 ViewModel이 정의 된 위치 (BLL)에 액세스 할 수 없습니다.

즉, DAL에 가입하여 BLL에 반환 할 수 없습니다. 하나의 쿼리에서 조인 대신 DAL에서 별도의 쿼리를 수행해야하며 BLL은 그 결과를 사용하여 ViewModel을 작성합니다. 이것은 매우 불편하지만 DAL을 ViewModels에 노출시켜야한다고 생각하지 않습니다.

이 딜레마를 어떻게 해결할 수 있습니까? 감사.

답변:


18

MVC의 M이 데이터 액세스 계층으로 이동 된 기본 MVC 프로젝트

일반적인 오해. M의는 MVC이렇게 주장하는 많은 예제와 자습서에도 불구하고, 데이터와는 아무 상관이있다.

M ViewModel이며 MVC 프로젝트에 있어야합니다. BLL에있는 ViewModel의 이름은 실제로 DataContracts 또는 BusinessModel입니다.

컨트롤러에는 이와 비슷한 것이 있습니다.

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

귀하의 서비스에서 다음과 같은 것이 있습니다.

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

그리고 DataAccess에서 요청 된 오브젝트에 따라 적절한 결합을 수행합니다. 그러나 필요한 경우 DataAccess에 사용자 정의 메소드를 추가하여 서비스에서 해당 메소드를 호출 할 수 있습니다.

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.