2013-03-09 3 views
1

중복을 유도하는 ViewModels를 만들지 않았습니까? 그 의미에서 나는 내 도메인 모델을 가지고 있으며 뷰에서 데이터를 표시해야합니다. 그래서 우리는 ViewModel을 만들고, 그것에 DataAnnotations를 추가하고 그것을 View에 표시합니다. 이 시점에서 나는 거의 동일한 데이터를 가진 2 개의 객체를 가진다.MVC viewmodel 이중화

답변

1

다른 사람들이 이미 말했듯이 가장 간단한 응용 프로그램 만 도메인 모델을 직접보기로 전달할 수 있습니다. 그때도 여전히 많은 이유 때문에 좋은 생각이 아닙니다.

보기의 요구 사항은 데이터 모델의 요구 사항과 다릅니다. 예를 들어,보기에는 필수이지만 조회 모델에서는 null 입력 가능 필드가있을 수 있습니다. `[Required] '속성을 추가하면 모델은 이제이 필드를 nullable이 아닌 것으로 간주합니다.

그러나보기에 도메인 모델을 사용하지 않은 유일한 이유는 보안 때문입니다. MVC를 사용하면 값을 게시 할 수 있으며 기본 모델 바인더는 모델에 게시하는 값을 행복하게 연결합니다. 즉, IsAdmin 플래그가 있고 누군가 IsAdmin에 대한 실제 값을 게시 한 경우 변경 사항을 저장할 때 모델, 누군가는 이제 관리자입니다.

웹 보안의 첫 번째 규칙은 사용자로부터의 신뢰 입력이 결코 아니므로 뷰 모델을 뷰에 직접 전달하면 기본적으로 데이터의 위생이 포기됩니다.

+0

응답 해 주셔서 감사합니다. ViewModel을 채우는 가장 좋은 방법은 무엇입니까 (Automapper를 사용할 수 있음). 이 작업을 수행하기 위해 컨트롤러 코드를 복잡하게 만드는 것보다 ViewModel을로드하는 것이 더 좋은 방법인지 알고 싶습니다. – itsbpk

+0

@itsbpk - AutoMapper를 사용하는 경향이 있지만 간단한 매퍼 메서드를 만드는 것이 매우 쉽습니다. 이를 확장 메소드로 구현하고 model.Map (otherModel)이라고 말할 수 있습니다. 어느 쪽이든, 그것은 당신의 컨트롤러를 혼란시킬 필요가 없습니다. –

1

예, 중복 형태입니다. 그러나 다른 목표를 달성하기 위해서는 종종 중복성이 필요합니다. 모델의 경우이 뷰 모델과 도메인 모델을 분리하면 뷰와 데이터 저장소 간의 분리 된 설정을 달성하는 데 도움이됩니다. 그리고 종종 ViewModels가 Domain의 정확한 사본이라는 것은 아닙니다.

어느 쪽이든 다른쪽에 영향을 미치지 않고 변경할 수 있음을 의미합니다. 이것이 가치있는 경우를 볼 수 있습니다 - 테이블의 데이터 유형 변경은 웹 응용 프로그램의 배포를 요구하지 않아도됩니다.

요약하면 중복성은 있지만 시스템이 이러한 중복성의 이점을 누릴만큼 복잡한 지 여부를 디자인하는 선택입니다.

0

아니요, 아니요. ViewModel을 사용하면 자체 용도가 있습니다. ViewModel이없는 도메인 모델의 엔티티가 두 개 이상인 상황을 생각해 봅시다. 어떻게 데이터를 구성 할 수 있습니까? 때때로보기에 필요한 데이터가 도메인 모델과 정확히 같지 않으며 개의 정보가 더 적거나 많을 수 있으며 때때로 렌더링보기 (예 : 형식 날짜 시간은 클라이언트의 culture에 따라 다름) 전에 도메인의 데이터를 사전 처리해야합니다.

또한 ViewModel은 웹 UI와 도메인 계층의 연결을 끊는 데 도움이됩니다. 도메인 모델의 엔티티는 데이터 표현 (뷰 모델의 유일한 목적)뿐 아니라 비즈니스 규칙을 모방 한 작업을 필요로하지 않으므로 필요하지 않은 UI 계층에 너무 많은 도메인 지식을 노출시키고 싶지 않습니다. 알기.

0

99 %의 경우 ViewModels에서 중복성이 발생하지 않습니다.

내 생각에 떠오르는 단 1 % 만 빈혈증 도메인 모델과 페이지가있는 단순한 응용 프로그램이지만 페이지에는 단일 모델 만 표시됩니다. 이것은 콘텐츠 관리 페이지에만 있습니다. 다른 경우

:
1) ViewModels 여러 도메인 모델에서 정보를 결합합니다는
2) 당신은 혼합하는 것은 좋은 생각이 아니다
3) 도메인 모델에서 도메인에 고유 한 논리를해야합니다 귀하의 도메인에 DataAnnotations와 같은 뷰별 메타 정보 표시