문제

Screen DTO를 사용하여 데이터간에 데이터를 캡슐화하는 프로젝트가 있습니다. 서비스 계층 그리고 프리젠 테이션 계층. 우리의 경우 프레젠테이션 계층은 ASP.NET입니다.

DTO에 대해 아는 유일한 클래스는 서비스 계층 클래스와 이러한 서비스를 호출하고 DTO를 표시하는 페이지/컨트롤입니다.

DTO는 거의 항상 페이지/컨트롤 특이 적이므로 프레젠테이션 계층에 속한다고 생각하지만 서비스 계층은 DTO를 사용하기 위해 프레젠테이션 계층을 참조해야한다는 것을 의미합니다.

서비스 계층이 더 풍부한 개체 (도메인 엔티티가 아님)를 반환해야한다고 생각한 다음 프레젠테이션 레이어는 이러한 객체를 가져 와서 각 페이지/제어 문제에 대해 매우 구체적인 DTO에 매핑 할 수 있습니다.

다음은 인터페이스 선언과 DTO가 있으므로 내가 말하는 내용을 볼 수 있습니다.

public interface IBlogTasks
{
    BlogPostDisplayDTO GetBlogEntryByTitleAndDate(int year, int month, string urlFriendlyTitle);
}

public class BlogPostDisplayDTO 
{
    public string Title { get; set; }
    public DateTime PostDate { get; set; }
    public string HtmlContent { get; set; }
    public string ImageUrl { get; set; }        
    public string Author { get; set; }
    public int CommentCount { get; set; }
    public string Permalink { get; set; }
}   

편집하다

다음은 도메인 모델이 포함되지 않은 유스 케이스를 설명하는 다른 코드 샘플입니다. 어쩌면 이것은 상황을 조금 명확하게 할 것입니다. 나는 DTO 의미를 과부하 시켰다고 생각합니다. 나는 와이어 위로 물체를 전송하는 기능에 대한 DTO에 대해 이야기하는 것이 아닙니다. 서비스 계층에 대한 커뮤니케이션 간의 계약을 공식화하기 위해 DTO를 만들고 있습니다.

public interface IAuthenticationTasks
{
    bool AuthenticateUser(AuthenticationFormDTO authDTO);
}

public class AuthenticationFormDTO
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool persistLogin { get; set; }
}

갑자기 내 인증에 IP 주소 매개 변수가 필요하다고 가정 해 봅시다. 이제 계약 인터페이스를 변경하지 않고 해당 속성을 DTO에 추가 할 수 있습니다.

엔터티를 프레젠테이션 계층으로 전달하고 싶지 않습니다. 나는 내 코드 뒤에 갈 수있는 능력을 갖기를 원하지 않습니다. BlogPost.AddComment(new Comment())

도움이 되었습니까?

해결책

'DTO'에 대한 정식 사용 사례는 "와이어 위로 전달할 수있는 직렬화 가능한 객체"라고 생각조차도,이 경우 실제로 '프리젠 테이션 트랜스퍼 오브젝트'또는 '뷰 모델'을 더 많이 언급하고 있습니다.

일반적으로 우리 프로젝트의 경우 이러한 라이브 위치에 대한 답변은 '번역'코드가 DDD 도메인 모델을 PTO 클래스에 매핑하는 위치입니다. 그것이 Prensenation 계층에 있다면 (아마도 그다지 큰 대답이 아님) Pres. 레이어는 PTO를 선언하는 곳입니다. 그러나 종종 당신을 위해 번역을하는 '서비스'와 '서비스'와 '프레젠테이션'이 모두 PTO에 대한 참조가 필요하고 (보통) 별도의 선언으로 이어지는 것을 의미합니다. 중립 프로젝트/어셈블리/네임 스페이스/프리젠 테이션 계층과 서비스 계층이 참조 할 수있는 모든 것.

다른 팁

실제 서비스 (웹 또는 WCF)를 사용하고 있습니까? 그렇다면 서비스 계층에서 DTOS를 정의하고 서비스를 추가 할 때 생성 된 프록시 (또는 이전 ASMX를 사용하는 경우 웹) 참조에 모든 DTO 유형이 포함됩니다. 이것은 가장 간단한 방법이며 ASP.NET 프로젝트와 서비스 프로젝트간에 느슨한 커플 링 만 유지합니다. 어느 방향 으로든 직접 프로젝트 참조가 필요하지 않습니다. DTO를 업데이트 할 때 서비스 참조를 업데이트하면 생성 된 프록시 클래스를 통해 웹 프로젝트에 업데이트를 자동으로 노출시키기 만하면됩니다.

어쨌든 DDD 접근 방식과 같은 것을 따르면 인프라 프로젝트 (예 : 웹 플랫폼 별 UI)가 도메인 객체를 반대로 참조하는 것이 가장 좋습니다. 그러나 위의 조언을 따르면 웹 프로젝트는 프로젝트에 전혀 직접적인 의존하지 않을 것이며, 이는 좋은 일이며 웹 프로젝트에 따라 풍부한 도메인 객체를 갖는 것보다 확실히 좋습니다. 고려 - 나는 당신이 이것을하고 있다고 말하지 않았다는 것을 알고 있습니다).

귀하의 DTO가 View-Specific 인 경우 UI 프로젝트에 포함시킬 것입니다. 뷰가 모델에서 필요한 것을 모델 로부터만 얻을 수 있도록하는 것은 실제로 컨트롤러의 작업이어야합니다. 경우에는보기에 필요한 필드 만있는 값 객체입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top