2012-07-23 4 views
2

많은 CRUD 기능을 포함하는 응용 프로그램에서 DDD를 구현하고 일종의 웹 API와 결합하면 도구로 비교적 간단하게 만들 수있는 상황이됩니다 플랫폼에서 제공하는 것이 더 어려워집니다.DDD 및 CRUD 형 응용 프로그램

우리가 사용자 개체를 가지고 말해, 당신은 빈혈 도메인 모델을 생성하지 않도록 열심히 노력하고, 그래서 당신은 더 표현 작업 모델링이 :

class User { 
    public void terminateAccount(TeminationReason reason); 
    public void reactivateAccount(); 
} 

위 클래스가 있기 때문에, 좋은 예를 들어, 계정을 해지 된 것으로 표시하고 한 번에 이유를 설정할 수 있습니다. 분명히 setEnabled (false)와 setTerminationReason (..)에 대한 개선점.

문지르면, 사용자가 GET/PUT 할 수있는 JAX-RS 웹 서비스가 있다고 가정 해 봅시다. 프레임 워크 (JAX-RS, JAXB)는 우리 DTO 객체를 쉽게 직렬화 및 비 직렬화합니다. 이제, 우리는 이전에했던 수있는 곳 :

entity.setEnabled(dto.isEnabled); 
entity.setTerminationReason(dto.getTerminationReason); 

우리가 대신 있습니다

if (entity.isEnabled() && !dto.isEnabled()) { 
    entity.terminateAccount(dto.getTerminationReason); 
} else if (!entity.isEnabled && dto.isEnabled) { 
    entity.reactivateAccount(); 
} 

큰 분리 여기에 도메인 개체의 비즈니스 중심의 인터페이스 및 CRUD 스타일의 액세스 패턴 인 RESTful API 이상. DDD와 REST는 모두 자신의 권리에서 모범 사례이므로, 모든 사람들이 여기에서 코드를 덜 고통스럽고 반복적으로 만드는 법을 배웠습니다.

PS - 배후의 ORM 프레임 워크를 사용할 때 실제 엔티티를 XML/JSON으로 직렬화하는 것은 지연로드를 제한 할 수 없기 때문에 DTO를 사용하고 있습니다. 또한 일반적으로 도메인 모델에 속하지 않는 RESTful API (참조 URL 등)를 통해 노출하려는 다양한 속성이 있습니다. 나는 여기서도 제안에 개방적이다.

답변

4

모든 API에서 User 엔티티를 나타 내기 위해 단일 DTO를 사용하려고합니다. 대신 필요한 데이터 만 포함하는 작업마다 별도의 DTO가 있으면 코드가 훨씬 간단 해집니다.

는 예를 들어, TerminateAccount API는 종료 이유와 DTO있을 것, 그리고 코드는 단순히 다음과 같습니다

user.terminateAccount(dto.terminationReason); 
+0

@TTar 글쎄, 당신은 또 다른 계층에 복잡성을 이동하지 않습니다? 이제 클라이언트는 사용자 선택에 따라'terminateAccount'와'activateAccount' 사이에 어떤 애플리케이션 서비스가 호출되어야 하는지를 알아야합니다. 응용 서비스에 캡슐화하는 것과 달리 복잡성을 이동시키는 것이 바람직합니까? – plalx

관련 문제