2010-06-23 6 views
0

"DDD"에서 다른 버전의 엔티티를 처리 할 때 가장 좋은 패턴은 무엇입니까? 목록에있는 개체와 전체 개체. 목록에 엔티티를 표시 할 때 필요하지 않은 속성을 가져 오는 오버 헤드를 피하고자합니다.엔티티 목록 처리에 좋은 패턴이 있습니까?

목록에서 별도의 엔티티 유형을 사용 하시겠습니까? 아니면 전체 엔티티 유형을 부분적으로 채우시겠습니까? 상속을 사용 하시겠습니까?

답변

0

도메인에서 모델의 '보기'를 만들겠다고 충고하지만이를 권장합니다. 개인적으로, 상황에 관계없이 도메인 내부의 전체 엔티티를 사용합니다. 엔티티는 엔티티이고, 그 이상이나 그 이상은 깨끗하지 않습니다. 그렇다고해서 항목에 대한 사용을 목록에 집중시키는 데 엔티티에 대한 참조를 사용할 수 없다는 의미는 아닙니다.

구현시 엔티티가 도메인 경계를 넘지 않습니다. 대신 DTO 유형을 반환하고 뷰를 추상화 할 수있는 응용 프로그램 서비스를 제공합니다. 예를 들어 발표자가 DTO에서 올바른 뷰 모델을 생성하여 뷰에 제공 할 수 있습니다. 도메인 서비스 또는 응용 프로그램 서비스의 작업에 대해 이야기하고 있는지 여부는 알 수 없지만 둘 중 하나 (또는 ​​둘 다)에 적용 할 수있는 몇 가지 작업이 있습니다.

도메인 계층의 전체 엔티티 작업의 성능 저하를 줄이기 위해 특정 작업을 수행 할 수도 있습니다. 살펴볼 한 가지 사항은 일종의 캐시 비공개 구현을 구현하는 것입니다. 엔티티가 요청되면 엔티티가 캐쉬되어 있는지 확인하십시오. 그럴 경우 캐시 된 버전을 반환하십시오. 그렇지 않은 경우 가져온 다음 캐시하여 반환하십시오. 엔티티가 업데이트되면 캐시에서 제거하고 업데이트하십시오. 필자는 캐시 구현을 위해 콘크리트 저장소 구현을 의도적으로 만들었습니다. 이와 같은 접근 방식을 사용할 때 고려해야 할 또 하나의 점은 가능한 한 많은 세밀한 작업을 수행하는 것이 유익하다는 것입니다. 엔티티가 데이터 저장소에서 일반적으로 "획득"되면 비합리적으로 보이지만 캐시 로깅에 대한 캐시 적중 횟수를 측정하기 위해 일부 로깅을 설정하는 것은 쉽습니다.

귀하의 질문에 대한 완전한 서클 ... 내가 다루는 대부분의 목록은 작기 때문에 엔티티 전체를로드하는 패널티가 발생합니다. 대부분의 유스 케이스는 사용자가 하나 이상의 항목에 드릴링하는 것을 포함한다고 가정하면 캐시와 별도로 구현되므로 사전 캐싱됩니다. 항목 수는 유동적이지만 일반적으로이 접근법은 목록에있는 25 개 미만의 항목에 적용됩니다.

큰 목록의 경우 ID 만 사용합니다. 대부분의 유스 케이스는 일종의 검색 결과이다. 검색 결과는 일반적으로 페이징되며 위의 패턴과 맞지 않습니다. 대신, 나는 ID의 큰 목록을 내가 관심있는 개체의 슬라이딩 범위 창으로 사용하여 모든 저장소가 가지고있는 GetRangeById() 메서드에 전달합니다. 의도적으로 식별자 목록을 가져 와서 캐시 된 시간. 본질적으로, 이것은 주어진 시점에서 내가 관심있는 영역에서 더 큰 가벼운리스트와 제로를 취할 것이다.

이러한 접근 방식을 통해 실현해야 할 중요한 점은 고도로 확장 가능하다는 것입니다. 작은 데이터 세트를 사용하는 캐시되지 않은 접근 방식만큼 빠른 속도로 실행되지는 않지만 더 많은 데이터 집합을 사용하면 성능이 향상됩니다. 여기에는 작동시 작동의 암시적인 성능 오버 헤드가 있지만 표준 "로드 업"패턴보다 느린 속도로 저하됩니다.

0

CQRS 패턴을 사용하여 쿼리 처리와 명령 처리를 분리 할 수 ​​있습니다. 또한 단일 데이터베이스에서도 작업을 수행 할 수 있습니다. 그런 경우에는 모델을 직접 databse의 테이블 (예 : NHibernate를 통해)에 매핑 할 수 있습니다. 명령 (쓰기)은 실제 도메인 모델을 거치며 DB에 유지됩니다. 쿼리 (엔티티 목록 가져 오기와 같은)는 도메인을 우회하여 DB를 바로 수행합니다.실제로 일부 비즈니스 로직을 호출하지 않고 일부 데이터 만 검색하기 때문에 도메인 객체를 쿼리 할 필요가 없습니다.

또한 명령 측면과 쿼리 측면에 대해 별도의 저장소를 보유함으로써이 솔루션을 완전한 기능의 CQRS로 확장 할 수도 있습니다. 질의 측면은 복제 또는 pub/sub 메시징을 통해 동기화됩니다.

관련 문제