2013-03-08 2 views
0

만들기, 목록, 업데이트 및 삭제와 같은 작업이있는 메시지 서비스가 있습니다.서비스 및 컨트롤러 메서드 비슷한 작업

이 서비스에는 ListByMember (int memberId) 메서드가 있습니다.

두 개의보기 (하나는 메시지 제목 만 표시), 다른보기는 메시지의 제목 및 설명 목록 표시, 다른 하나는 제목 및 메시지 답변 합계를 나열해야합니다 받았습니다.

서비스 계층에서 하나의 메소드를 작성하고 DTO를 통해 메시지 엔티티의 모든 정보를보기 및보기로 전송할 수 있는지 알 수 없습니다. 원하는 필드 만 표시하거나 세 가지 메소드를 작성하십시오. 서비스 계층에서 자신의 DTO 및 특정보기에 독립적이어야합니다.

하나의 단일 서비스 방법을 만드는 것이 두렵습니다. 앞으로 특별한 메시지 목록이 필요할 경우 문제가 발생할 것입니다.

조언이 도움이 될 것입니다.

감사합니다.

답변

1

뷰/컨트롤러 작업은 비즈니스 로직을 배치하기에 최적의 장소가 아닙니다. 약간의 추가 코드를 의미하는 경우에도 서비스에서 세 가지 방법을 시도하십시오. DTO를 사용하여 정말 훌륭하게 프로젝트하기로 결정했습니다. 당신이 걸릴 수 있습니다 한 가지 방법은 당신이 된 IQueryable의 팬이 아닌 경우 저장소에서 된 IQueryable로 DTO들을 얻고 예

// DTOs 
public class MessageSummaryADto 
{ 
    public int MessageId { get; set; } 
    public string Title { get; set; } 
} 

public class MessageSummaryBDto : MessageSummaryADto 
{ 
    public string Description { get; set; } 
} 

// public methods 
public int GetMessageCount() 
{ 
    return GetMessageSummary().Count(); 
} 

public IQueryable<MessageSummaryADto> GetMessageSummaryADto() 
{ 
    return GetMessageSummary().Select(m => new MessageSummaryADto { MessageId = m.MessageId, Title = m.Title }); 
} 

public IQueryable<MessageSummaryBDto> GetMessageSummaryBDto() 
{ 
    return GetMessageSummary(); 
} 

// the private method 
private IQueryable<MessageSummaryBDto> GetMessageSummary() 
{ 
    return yourMessageRepository.Select(m => 
     new MessageSummaryBDto { 
      MessageId = m.MessageId, 
      Title = m.Title, 
      Description = m.Description 
     } 
    ); 
} 

으로 공개 방법을 통해 그것을 노출 개인 방법을 만드는 것입니다, 당신은 노출 될 수 있습니다 IList의

행운 서비스의 두 가지 수준, 비즈니스 서비스 및 UI 서비스에 대한

+0

안녕 덕분에, 모든 DTO I에 대한 당신의 의견에 너무 이 DTO 유형을 반환하는 Service Public Method가 있습니까? 또 다른 질문입니다. 다른 엔터티의 데이터를 필요로하는 ViewModel이 있다면, 블로그에서 블로그 주석을 말하게하십시오. 로컬 뷰 모델에서만 필요한 코멘트의 세부 정보로 로컬 클래스를 만들고 목록 주석 서비스를 작성하십시오 메소드를 사용하거나 coments 서비스 메소드를 사용하여 coments viewmodel을 사용하여 목록을 작성 하시겠습니까? 나는 외부 필드를 필요로한다면 외부 coments 클래스를 사용하면 미래에 변경을 제한 할 수 있다고 생각한다. 미리 감사드립니다. – Patrick

+0

안녕하세요, 블로그의 의견을 분리하는 개념이보기에서만 필요한 경우 UI 레이어에서 DTO를 만든 다음 IQueryable 을 반환하는 서비스를 사용하여 컨트롤러 작업 내에서 프로젝트를 투영합니다. UI를위한 별도의 서비스 레이어가있는 경우 UI에서 UI 서비스 레이어로 모델을 옮기고 거기에서 프로젝션을 수행하고자 할 것입니다. 개념을 설명하기 위해 코드 스 니펫을 게시하고 싶습니다. 그러나 주석은 제한된 수의 문자를 제공합니다. –

+0

안녕하세요, 도메인 -> 서비스 방법 -> 도메인을 DTO로 매핑 -> 컨트롤러 작업 -> 안녕하세요. ViewModel에 DTO 맵핑 -> 액션의 모든 "라인"에 대해 본다. 나는이 라인을 가지고 있는가? 원하는 경우 답변을 편집하고 완료 할 수 있습니다. 감사합니다 – Patrick

0

내 두 번째 대답은 보증으로 DTOS. 목록 및 격자와 같은 것들에 대한 투영 및 필터와 같은 매우 특정한 UI 처리가있는 경우이 접근 방식을 원할 수 있습니다. 비즈니스 서비스는 UI에 중립적 인보다 일반적인 메소드를 노출합니다.

그래서 매핑 방법은 다음과 같습니다.

도메인 오브젝트 (출력 : 비즈니스 개체) -> 비즈니스 서비스 (출력 일반 DTO들) -> UI 서비스 (UI 특정 DTO들) -> 컨트롤러 조치 ->보기

오프로드 UI 특정 서비스에 대한 데이터의 슬라이싱 및 다이 싱의 UI 작업은 컨트롤러 동작을 매우 가늘게 만듭니다. 일반적으로 제어기 작업의 코드 줄 수를 10 ~ 15 개로 제한 할 수 있다면 좋을 것입니다.

코드 비즈니스 서비스와 UI 서비스를 분리하면 여러 UI를 쉽게 사용할 수 있습니다. 예를 들어 비즈니스 서비스가 UI 중립적 인 경우이를 사용하여 ASP에 카터를 적용 할 수 있습니다.MVC 및 WPF 응용 프로그램

위 접근 방식은 유지하기 위해 추가 레이어의 가격으로 제공하지만 명확한 분리를 원하는 경우, 그것은

건배

을 고려 가치가
+0

안녕하세요, 감사합니다. 네가 말한대로 비용이 들것입니다. 여기 옵션은 각 DTO에 대해 하나의 서비스 메소드를 갖는 것입니다. 다시 한 번 감사드립니다. – Patrick

관련 문제