2009-12-30 7 views
78

나는 도메인 객체를 유지하기 위해 NHibernate를 사용하고있다. 간단하게하기 위해 ASP.NET MVC 프로젝트를 내 프리젠 테이션 레이어와 서비스 레이어로 사용하고 있습니다.DTO = ViewModel?

내 컨트롤러 클래스에서 내 도메인 개체를 XML로 반환하려고합니다. Stack Overflow에서 일부 게시물을 읽은 후 DTO를 수집합니다. 그러나 ViewModel에 대해 이야기하는 게시물도 보았습니다.

내 질문 : 데이터 전송 객체와 ViewModel이 같은 것입니까? 아니면 ViewModel은 DTO의 일종의 하위 패턴입니까?

+7

ASP.NET MVC의 ViewModels는 WPVM (MVVM)의 ViewModels와 100 % 동일하지 않습니다. 대부분의 응답에서 MVVM을 언급하고 ASP.NET MVC로 작업하고 있다는 점에 관련이 있습니다. –

답변

73

DTO의 표준 정의는 아무런 동작없이 개체의 데이터 모양입니다.

ViewModels는 뷰 모델입니다. ViewModels는 일반적으로 하나 이상의 객체 (또는 DTO)의 전체 또는 부분 데이터와 뷰의 비헤이비어에 특정한 추가 멤버 (뷰에서 실행할 수있는 메서드, 뷰 요소를 전환하는 방법 등을 나타내는 속성)입니다. 뷰 모델을 볼 수있는 모든 데이터와 동작으로 볼 수 있습니다. ViewModels는 일대일을 비즈니스 객체 또는 DTO에 매핑 할 수도 있고 매핑하지 않을 수도 있습니다.

덧붙여서 NHibernate projections는, 특정의 뷰 모델이 영속 객체로부터의 데이터의 부분 집합을 필요로하는 경우에 편리합니다. MVVM 패턴에서

6

몇 가지 간단한보기에서는 내 DTO를 모델로 사용하지만보기가 복잡 해짐에 따라 ViewModels를 작성합니다.

내게는 (이미 이미 가지고 있기 때문에) 신속성 (DTO 사용)과 유연성 (ViewModels를 만드는 것은 더 많은 관심을 의미 함) 사이의 균형입니다.

+2

좋은 실용적인 답변. –

27

DTO! = 뷰 모델은

뷰 모델은보기에서 모델을 분리하는 데 사용됩니다. 모델을 표현하기 위해 단순한 DTO 클래스를 사용할 수 있습니다.이 클래스는 다시 예를 들어를 통해 데이터베이스에 매핑됩니다. NHibernate. 그러나 나는 DTO로 모델링 된 ViewModel 클래스를 본 적이 없다. ViewModel 클래스는 대부분 DTO에없는 동작을 가지고있다.

+2

그래서 DTO는 단지 구조체 일 수 있습니다 (또는 구조체의 기능을 모방해야하는 클래스입니까?)? –

16

DTO - 데이터 전송 객체는 정확히 데이터 전송을위한 컨테이너입니다. 그들은 아무런 행동도하지 않고 단지 세터와 게터들만을 가지고 있습니다. 어떤 사람들은 그것들을 변경 가능하게 만들고 기존의 것을 갱신하는 것이 아니라 필요할 때 새로운 것을 생성합니다. 와이어를 통해 전송할 수 있도록 직렬화 가능해야합니다.

일반적으로 DTO는 원격 서비스에 대한 호출이 비쌀 수 있으므로 모든 필수 데이터가 DTO로 푸시되고 하나의 청크로 클라이언트로 전송되는 것처럼 프로세스 경계를 ​​넘어 한 계층에서 다른 계층으로 데이터를 전달하는 데 사용됩니다 (대용량).

그러나 일부 사람들은 화면 바인딩 된 DTO 개념을 사용합니다 (프로세스 경계를 ​​넘어서서는 안됩니다). 다시 이것은 필수 데이터 (일반적으로 특정 화면에 필요한 데이터 및 다양한 소스의 데이터 집합 일 수 있음)로 채워지고 클라이언트로 전송됩니다. 이미 인 뷰 모델에 ㄱ 뷰 모델의 생성과 DTO 데이터의 하역 필요이 DTO 뷰에 바인딩하지만 더 복잡한 경우에 사용될 수 언급 한 바와 같이 간단한 경우

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

분명히 더 많은 작업 (MVVM 패턴을 적용 할 때).

그래서 다시 이미 언급 한 바와 같이 DTO! = 뷰 모델

DTO와 뷰 모델은

46

뷰 모델 ASP.NET의 MVC 연습이 같은 삶의 다른 목적을 가지고 DTO이지만 MVVM의 ViewModel 패턴은 DTO와 다릅니다. MVVM의 ViewModel에는 동작이 있지만 DTO에는 동작이 없기 때문입니다.

+4

이것은 좋은 대답입니다. 세부 사항은 짧지 만. – Phil

+3

asp.net mvc의 ViewModel이 DTO와 같은 이유는 무엇입니까? 그건 말이 안돼. ViewModel은 DTO가 아닌 동작을 가질 수 있습니다. 이것은 mvc에 의존하지 않습니다. – Elisabeth

+4

+1은 ASP.NET MVC ViewModel과 MVVM ViewModel을 구분합니다. – Ronald

10

첫째, 주요 차이점은 ViewModel에 DTO가 없어야하는 동작이나 메서드가있을 수 있다는 것입니다.

둘째, ASP.NET MVC에서 ViewModel로 DTO를 사용하면 응용 프로그램이 DTO에 밀접하게 결합되어 DTO를 사용하는 것이 가장 이상적입니다. 그렇게한다면, 도메인 모델 또는 DTO를 사용하는 diffrence는 무엇이며, 안티 패턴을 얻으려면 더 복잡한가?

또한 ASP.NET의 ViewModel은 유효성 검사에 DataAnnotations를 사용할 수 있습니다.

동일한 DTO는 다른 ViewModels 매핑을 가질 수 있으며 하나의 ViewModel은 다른 DTO (항상 컴포지션이 아닌 개체 매핑을 사용)로 구성 될 수 있습니다. 왜냐하면 DTO가 포함 된 ViewModel을 가지고 있다면 문제가 더 심각 할 것이기 때문입니다.

프리젠 테이션 계층에서 DTO를 계약으로 생각하면 응용 프로그램을 낯선 사람으로 간주해야하며 해당 서비스를 제어 할 수없는 개체를 받게됩니다. dto 및 프리젠 테이션 레이어는 귀하의 것입니다).

마지막으로이 분리 작업을 수행하면 개발자가 쉽게 함께 작업 할 수 있습니다. ViewModels, Views 및 Controller를 디자인하는 사람은 다른 개발자가 구현을 마칠 때 매핑을 만들 것이기 ​​때문에 서비스 레이어 또는 DTO 구현을 걱정할 필요가 없습니다 ... 그는 조롱 도구 또는 수동 조롱을 사용할 수도 있습니다 테스트 용 데이터로 프레젠테이션 레이어를 채 웁니다.

+0

방금 ​​VS 2012를 설치하고 MVC 4 Single Page Application을 보았습니다. 샘플 프로젝트에서 DTO는 WebApi의 컨트롤러 메소드 (또는 액션)에 대한 매개 변수로 사용됩니다.즉, JSON은 이러한 메서드에 게시되고 일부 MVC 마법을 ​​사용하면 메서드에 전달되기 전에 데이터가 자동으로 DTO로 변환됩니다. 이 경우 DTO를 사용하는 것이 잘못되었다고 생각하십니까? ViewModel을 웹 API와 함께 사용해야합니까? 나는 아직도 이러한 개념에 익숙하지 않기 때문에 더 잘 이해할 것을 요구합니다. –

+0

Salut Jean-François Beauchamp :) ASP.NET MVC는 URL prams를 객체로 구문 분석 할 수 있습니다. 예 : 인덱스 메소드 ajax/index/{jobID}/{ResultsToSkip}/{ResultsToSend}에이 매핑이 있다고 가정합니다. " 대신 indexle (int jobID, int ResultsToSkip, int ResultsToSend) 색인 (요청은 3 개의 필드를 캡슐화하는 객체입니다 ...) 이제 params 대신에 대화하고 있습니다. DATA를 캡슐화하는 객체를 사용하여 애플리케이션을 구현할 수 있습니다. 예를 들어 requestDTO라고 할 수 있습니다. 예를 들어, 다른 필드 하나를 추가해야만 API 인터페이스 메소드가 아닌 DTO 만 변경할 수 있습니다. –

0

DTM을 ViewModel로 사용한다면 DTM을 변경하는 몇 가지 이유 때문에 ViewModel에 영향을 줄 수 있으므로 DTO에 대한 의존도가 높다는 뜻입니다.

더 나은 사용 DTO &는 뷰 모델로 변환합니다.