2011-03-16 2 views
14

POCO 도메인 모델과 NHibernate 리포지토리 레이어가있는 ASP.NET MVC 2 응용 프로그램이 있습니다. 내 도메인 모델에는 내 viewmodels에 대한 인식이 없으므로 automapper를 사용하여 viewmodel에서 entity 및 vice versa로 이동합니다.도메인 엔터티, DTO 및보기 모델

프로젝트에 WCF를 도입했을 때 (늦은 요구 사항) 연결되지 않은 객체를 처리해야하기 시작했습니다. 즉, NHibernate를 사용하여 데이터베이스에서 엔티티를 검색하고 해당 엔티티가 직렬화되면 연결이 끊어 지거나 관계없이 각 자식 컬렉션이로드되는지 여부와 상관없이 불필요한 데이터베이스 작업을 많이한다는 의미입니다.

이 글을 읽은 후에는 도메인 프로젝트 외부에서 엔티티를 공개하지 말고 대신 DTO를 사용해야합니다.

이 이유는 알고 있지만 구현 방법을 파악하는 데 문제가 있습니다.

ASP.NET MVC에서 viewmodel에서 DTO로 매핑하고, 서비스 계층을 통해 DTO를 전송하고, DTO에서 서비스 계층의 엔터티로 매핑합니까? 내 DTO는 어디에 정의해야합니까?

답변

15

내 서비스 계층에서 엔티티를 캡슐화하고 DTO 만 리턴/수신하도록합니다. DTO뿐만 아니라 서비스 계약도 MVC 프로젝트와 서비스 구현이 참조하는 별도의 어셈블리에 보관합니다.

서비스 호출 구현 내에서 서비스는 dto를 엔티티에 매핑 한 다음 필요에 따라 리포지토리 및 기타 엔티티와의 상호 작용을 수행합니다.

app/mvc 프로젝트에서 가끔씩 게으르다가 DTO를 특정 동작 (특히 CRUDy)의 모델로 사용합니다. 그런 프로젝션이 필요하다면 뷰 모델을 만들어서 오토 마커 등으로 DTO와 뷰 모델 사이를 변환 할 것입니다.

엔티티가 얼마나 많이 논쟁의 대상이되는지. 어떤 사람들은 뷰/앱 계층으로 그들을 밀어 넣을 것입니다. 나는 그들을 서비스 계층에 유지하는 것을 선호한다. 엔티티가 서비스 계층을 떠나면 상호 작용이 이루어지는 곳 어디에서나 비즈니스 로직 유형의 작업을 수행 할 수 있다는 것을 알게되었습니다. 아마도 서비스에 있어야 할 것입니다.

+0

이것은 분명히 제 상황에 가장 잘 적용됩니다 - 저는이 문제에 대한 토론이 있다는 것을 깨닫지 못했습니다. 나는 내 서비스 계층을 넘어선 엔티티를 노출시키는 것이 슬픔의 원인이라는 것을 알았지 만 WCF를 프로젝트에 추가 할 때까지는 이러한 문제가 발생하지 않았습니다. – Mayo

+1

당신의 애플리케이션이 분산되어 있지 않다면 (애플리케이션과 서비스 레이어 사이에 네트워크 갭이 없다) 문제가별로 없다고 생각합니다. 나는 응용 프로그램의 모든 레이어에서 엔티티를 사용하도록 권장하는 MS 기사를 보았습니다. 나는 또한 "alt.net"유형의 기사에서 위의 구조를 더 자주 보았고, 그것은 나를 위해 더 잘 작동합니다. 또한 응용 프로그램에 대한 내 생각을 단순화, 서비스는 진정으로 도메인 진입 점입니다. – Brook

1

MVC 프로젝트에서 DTO를 정의한 다음 도메인 엔터티에서 DTO로 변환하는 확장 메서드를 만드는 것이 좋습니다 (그 반대의 경우도 마찬가지입니다).

변환은 mvc 함수에서 수행됩니다.

2

UI 레이어 (MVC 앱)가 요청하기 때문에 ViewModels와 같은 DTO를 처리합니다. 당신은 엔티티 -> DTO -> ViewModel로 갈 수 있지만, 서비스의 유일한 소비자가 MVC 애플리케이션 인 경우 공학을 넘어서는 것으로 생각됩니다. 어떻게 든 DTO가 실제로 화면 스펙이 아닌 데이터에 실제로 사용된다면 추가 매핑을 사용해야 할 것입니다.

또한 WCF 레이어에서 엔터티를 반환하고 클라이언트에서 자동으로 생성 된 프록시 개체를 DTO로 지정했습니다. 엔터티는 프록시 클래스로 인해 거의 DTO가되며 비즈니스 로직이 클라이언트에 제공되지 않습니다.

물론이 모든 것이 "아키텍처에 따른 목표"입니다. 이 질문은 경계적인 주관적이고 논쟁적인 IMHO입니다.

0

방금 ​​전 DTO < -> DO 변환을 둘러싼 방법에 대한 게시물을 작성했습니다.어쩌면 당신은 그것을 체크 아웃 할 것입니다 http://codeblock.engio.net/?p=17