2009-11-12 3 views
2

Aggregate Roots에 대한 나의 이해가 정확하다면 루트는 "children"중 하나를 삭제해야합니다. 이는 다음과 같은 것으로 해석됩니다.집계 루트는 하위 노드 중 하나를 어떻게 삭제합니까?

order.removeOrderLine(23); 

효과적으로 컬렉션에서 제거 할 것입니다. 그러나, 이것은 어떻게 지속됩니까? 내 ORM의 UnitOfWork가 그 콜렉션에서 누락 된 것이 무엇인지 감지하고 데이터베이스에서 삭제해야합니까?

대신에 OrderRepository의 메소드를 removeOrderLine해야합니까?

답변

4

귀하의 작업 단위 (Unit of Work)는 일반적으로이를 처리해야하지만, 구현에 따라, 특히 변경 사항을 감지하는 방식에 따라 다릅니다. 일부 작업 단위 (예 : Hibernate)는 변경하기 전에 집계 사본을 유지하므로 비즈니스 트랜잭션이 끝날 때 (unitOfWork.PersistAll()과 같은 것을 호출 할 때) 모든 객체의 현재 버전을 일치 시키려고 시도합니다 및 컬렉션)을 원본 버전과 비교합니다.

다른 방법은 도메인 엔티티가 작업 단위에 더 많이 결합되도록하여 엔티티가 무언가가 변경되었을 때 작업 단위에 알리는 것입니다 (예 : order.removeOrderLine 메소드가 작업 단위에 변경 사항을 알리는 경우).

UoW 변경 감지를 구현하는 방법에는 여러 가지가 있습니다. 영감을 얻기 위해 최대 절전 모드 구현을 살펴보십시오.

+0

컬렉션 변경 추적과 관련하여 "추가"및 "제거"메서드에 대한 모든 호출을 캡처하고 2 개의 내부 "컬렉션"에 추가/제거 된 개체를 저장하는 사용자 지정 컬렉션을 구현하는 데 좋은 경험이 있습니다. 추가 된 항목, 제거 된 항목의 모음 1 개. 그러면 UoW는 단순히 무엇이 변경되었는지 컬렉션에 요청할 수 있습니다. – Tomas