2012-04-24 1 views
6

나는 WCF 서비스를 가지고 있으며 방금 비즈니스 개체에 대한 DTO를 만들었습니다.데이터 전송 객체 - DTO 또는 비즈니스 객체에서 매핑합니까?

제 질문은 두 가지 사이의 매핑을 어디에 두어야합니까?

가) DTO?

public class PersonDTO 
{ 
    [DataMember] public string Id    { get; set; } 
    [DataMember] public string Name   { get; set; } 

    public void CloneFrom(Person p) 
    { 
     Id = p.Id; 
     Name = p.Name; 
    } 

    public void Populate(Person p) 
    { 
     p.Id = Id; 
     p.Name = Name; 
    } 
} 

또는 비즈니스 오브젝트에서

B)?

public class Person 
{ 
    public string Id    { get; set; } 
    public string Name   { get; set; } 

    public void CloneFrom(PersonDTO dto) 
    { 
     Id = dto.Id; 
     Name = dto.Name; 
    } 

    public PersonDTO GetDTO() 
    { 
     return new PersonDTO() 
     { 
      Id = Id; 
      Name = Name; 
     } 
    } 
} 

나는 (DTO들에 대한 지식이없는 비즈니스 오브젝트) A의 우려의 분리를 좋아하지만 B의 캡슐화 (DTO에 비즈니스 오브젝트 용기를 노출 할 필요가 없습니다)를 선호한다.

표준 방법이 있는지 궁금한가요?

답변

11

나는 BO와 DTO가 다른 클래스로의 변환에 관심을 가져서는 안되기 때문에 이것은 별도의 클래스를 요구한다고 생각한다.

저는 개인적으로 객체 변형을위한 자동 매핑 라이브러리를 사용합니다. 예제에서와 같이 단순한 변환을 사용하면 매핑을 한 줄의 코드로 수행 할 수 있으며 복잡한 변환도 쉽게 설정할 수 있습니다.

자신을 매핑하려는 경우 확장 구현 방법을 사용하여 매핑 구현을 DTO 및 BO 클래스와 구분할 수 있습니다.

+0

정말요? 세 번째 클래스가 매핑을 수행 할 수 있도록 내 비즈니스 객체를 노출하려면 DTO에서 수행해야합니다. 아직 또 다른 클래스를 만드는 것은 나에게 너무 잔인한 것처럼 보인다. 그래도 automapper 살펴 보겠습니다, 감사합니다. – GazTheDestroyer

+4

@GazTheDestroyer : DTO는 데이터 전송이 변환되지 않음을 의미합니다. DTO는 그 사용법, 즉 매핑을 인식하지 못한다. 그것은 데이터를 전송합니다. 예를 들어 ViewModel에 맵핑하는 것은 이제까지 목적을 위해 데이터를 사용하는 것은 소비자의 몫입니다. 당신은 DTO에 매핑을 추가 할 수는 있지만 저의 겸손한 견해로는 DTO의 의도 된 목적을 그리워하여 DTO가 더 이상 DTO가 아니기 때문에 의미가 있습니다. 현재 프로젝트에서 저장소는 엔티티를 생성합니다. BL은 엔터티를 받고 DTO에 매핑합니다. UI 레이어는 BL을 쿼리하고 DTO를 가져 와서 ViewModels에 매핑합니다 (필요한 경우). – Nope

1

나는 구성 요소 레이어를 제안합니다. 비즈니스 계층과 데이터 계층 간의 통신에는 책임감이 있어야합니다. 이 경우 DTO 개체를 Business Objects로 변환하는 데 사용할 수 있습니다.

+0

내 경험에 의하면, NetTiers가 좋은 특성을 지니고 있지만, 실제 작업은 실망 스러울 수 있습니다. http://stackoverflow.com/questions/8220206/whither-nettiers –

+0

@DavidClarke 참고 자료는 주로 컴포넌트 레이어. 내가 제공 한 링크가 깨 졌으므로 제거하겠습니다. :) – Khan

0

"DTO에 비즈니스 객체를 노출 할 필요가 없습니다"라는 걱정은 공개 속성에 액세스 했으므로 코드에 표시되지 않는 것이 아닌 한 근본적인 것입니다. 로

제쳐두고, 당신이 대신 캐스트 연산자 구현할 수 대신 복제 방법이있는의 : MSDN

당신은 같은 것을 할 수있는 방법 : 사람의 P = (사람) myPersonDTO을;

+0

예, 제 예제는 매우 간단했습니다. 현실적으로 비즈니스 객체에는 매핑 목적으로 공개하고 싶지 않은 비공개 정보가 있습니다. – GazTheDestroyer

+1

BO의 내용이 개인/보호 된 것으로 정의 된 경우이를 사용하는 모든 항목이 표시되지 않으므로 문제가 무엇인지 알 수 없습니다. – Peter

관련 문제