2011-01-28 6 views
1

DTO를 도메인 객체로 변환 할 때 리포지토리를 사용하는 것이 나쁜 디자인인지 알고 싶습니다.리포지토리를 사용하는 객체 매퍼

저는 ORM 용 저장소 계층과 서비스 계층과 ef4가있는 n 계층 웹 응용 프로그램을 구축하고 있습니다. 서비스 계층은 DTO 버전의 도메인 개체를 노출합니다. 서비스 소비자로부터 DTO를 받으면 서비스는 AutoMapper를 사용하여 DTO를 도메인 객체로 변환합니다.

public class LogonEventDto 
{ 
    public DateTime Time 
    { 
     get; 
     set; 
    } 

    public Guid UserId 
    { 
     get; 
     set; 
    } 
} 

도메인 버전 :

DTO 버전 - 이제 도메인 개체의 멤버 속성의 몇 가지 예를 들어 나는 아래의 클래스가 데이터베이스에서로드해야합니다 그것은 DO 버전으로 DTO 변환에 관해서 지금

public class LogonEvent { public DateTime Time { get; set; } public User User { get; set; } } 

, 나는 UserRepository에 GetById() 메소드를 호출하고 LogonEvent.User 속성 재치를 설정해야합니다 그 결과.

내가 알기로 현재 서비스 계층에서 모든 변환 논리를 수동으로 처리하고 있습니다.

위의 질문에 위와 같이 잘못된 디자인 결정이 적용되는 이유는 무엇입니까?

답변

1

나는 이렇게 상식적으로 생각합니다. 내부 계약서 (도메인 모델)와 서비스 계약 (dto/data 계약)을 분리합니다. 이렇게하면 내부를 노출시키지 않고 공용 서비스 계약에 영향을 미치지 않고 구현을 리팩토링 할 수 있습니다 (매핑이 여전히 가능하다고 가정 할 때).

우리는 SOA (-isch) 고객 프로젝트에서 항상이 패턴을 사용합니다. 우리는 매핑 코드를 생성하는 데 도움이되는 도구도 있습니다.

런타임에 매핑을 지정해야하기 때문에 AutoMapper의 팬이 아닙니다 (코드는 매우 멋지지만). 매핑을 작성하기 위해 코드를 작성해야하기 때문에. 내 생각에 매핑 정의는 디자인 타임입니다. 이것이 바로 코드 생성 도구를 구축 한 이유입니다.

  • 이 (id로) 데이터를 가져 오지 마십시오 개별적으로 각 레코드에 대해 :

    내 경험에서 나는 다음과 같은 발생했습니다. 대신 하나의 왕복 (데이터베이스/데이터 소스/다른 웹 서비스)으로 해결하려는 ID 목록을 조합하고 매핑이 검색된 배치에 대한 검색을 수행하도록합니다.
  • 원본과 대상 사이에 많은 개체와 클래스 계층 구조가있는 복잡한 매핑을 사용하면 매핑 한 내용, 위치 및 방법에 대한 개요를 유지하기가 어렵습니다. 아직 실제 솔루션이 없습니다. 단점을 해결하는 도구를 만드는 것 외에는 다릅니다.

희망이 있습니다. Grtx, Marc

관련 문제