문제

나는 사람들이 골재의 일부인 엔티티의 변화를 감지하기 위해 사람들이 어떤 접근을했는지 찾고자합니다. 나는 작동하는 것이 있지만 나는 그것에 대해 미쳤다. 기본적으로 내 저장소는 집계 루트의 상태가 변경되었는지 여부를 결정해야합니다. 내가 호출되는 집계 루트가 있다고 가정 해 봅시다. Book 그리고 엔티티가 전화했습니다 Page 집계 내에서. ㅏ Book 하나 이상의 것을 포함합니다 Page a에 저장된 엔티티 Pages 수집.

주로 삽입 대 업데이트 시나리오는 골재 루트와 그 엔티티를 검사하여 키의 존재를 결정함으로써 수행됩니다. 키가 존재하는 경우, 객체가 한 번에 기본 데이터 소스에 저장된 것으로 추정됩니다. 이것은 업데이트 후보가됩니다. 그러나 그것은 단체에 대한 단독에 근거하여 결정적이지 않습니다. 집계 루트를 사용하면 대답이 분명합니다. 단 하나의 단일 진입 지점이므로 주요 존재가 작업을 지시한다고 가정 할 수 있습니다. 제 경우에는 수정 날짜를 캡처 할 수 있도록 집계 루트 자체를 다시 저장하는 것이 허용되는 시나리오입니다.

실체 자체에 대한이 행동을 촉진하기 위해 EntityBase 클래스에는 두 가지 간단한 속성이 포함됩니다. IsUpdated(), IsDeleted(). 이 두 기본값은 모두 false입니다. 이전에 언급했듯이 열쇠의 존재를 기반으로 결정을 내릴 수 있기 때문에 그것이 새롭인지 아닌지 알 필요가 없습니다. 구현의 메소드,이 경우 페이지에는 백업 데이터 세트를 변경하는 각 방법이 있습니다. IsUpdated() 사실.

예를 들어, Page에는 UpdateSectionName() 이는 SectionName 읽기 전용 속성. 이 접근법은 해당 데이터 설정을 수행하는 방법 (엔티티가 유효하지 않은 상태로 들어가는 것을 방지)에서 유효성 검사기의 논리적 첨부 포인트를 허용하므로 일관되게 사용됩니다. 최종 결과는 내가 this.IsUpdated() = true; 방법의 끝에.

집계 루트가 Save() (로직 스위치 Insert() 또는 Update() 작동), 그런 다음 반복 할 수 있습니다 Pages 컬렉션 Book, 세 가지 시나리오 중 하나가있는 페이지를 찾고 있습니다.

  1. 열쇠가 없습니다. ㅏ Page 키가 없으면 삽입됩니다.
  2. IsDeleted = true; 삭제는 업데이트를 능가하며 삭제가 커밋됩니다. Page.
  3. IsUpdated = true; 페이지에 대한 업데이트가 커밋됩니다.

이렇게하면 페이지 컬렉션에있는 모든 것을 맹목적으로 업데이트하지 못하게합니다. 예를 들어 책에 수백 페이지 엔터티가 있다면 어려울 수 있습니다. 나는 책의 사본을 검색하고 비교를 수행하고 감지 된 변경 사항 만 저지른 것을 고려하고 있었지만 (존재 및/또는 비교에 따라 삽입, 업데이트 및 삭제). .

주요 단점은 개발자가 엔티티의 각 방법에서 Isupdated를 설정해야한다는 것을 기억해야한다는 것입니다. 하나를 잊어 버리면 해당 값의 변경 사항을 감지 할 수 없습니다. 나는 투명하게 타임 스탬프 변경을 할 수있는 일종의 맞춤형 백킹 스토어에 대한 아이디어를 가지고 놀았습니다. IsUpdated 저장소가 업데이트를 집계하는 데 사용할 수있는 읽기 전용 속성.

저장소는 집계 루트가 추가 될 때 생성 된 타임 스탬프를 기반으로하는 작업 패턴 구현 단위를 사용하고 있습니다. 운영을 위해 대기하는 여러 엔티티가있을 수 있으므로 엔티티 작업이 롤업되고 집계 루트 작업 (들)이 실행되기 직후에 실행됩니다. 나는 그것을 한 단계 더 발전시키고 엔티티 운영을 처리하고 엔티티에서 사용 된 일종의 이벤트 추적을 기반으로 한 다른 작업 단위를 만드는 것을 볼 수있었습니다 (시장에있는 ORM 제품 중 일부가 성취 한 것으로 가정합니다. 비슷한 수준의 기능).

그러나이 방향으로 계속 움직이기 전에, 나는 이것에 관한 아이디어/추천/경험을 듣고 싶습니다.

편집하다: 알 수있는 몇 가지 추가 정보 :

  1. 내가 작업하고있는 현재 언어는 C#이지만 가능한 한 많은 언어 별 정보를 유지하려고 노력했지만 이론적 인 토론이기 때문입니다.
  2. 저장소/서비스/엔티티 등의 코드. 그의 저서 인 ".NET 도메인 구동 디자인이있는 C#"및 지원 코드에서 Tim McCarthy의 개념을 기반으로합니다. 코드 플렉스. 내가 작업하고있는 것이 처음부터 다시 작성되었지만 접근 방식의 유형에 대한 이해를 제공합니다.
도움이 되었습니까?

해결책

요컨대, 내 대답은 내가 제안한 것을 가지고 갔다는 것입니다. 개선의 여지가 있다고 확신하지만 효과가 있습니다. 변화에는 실제로 시간이 거의 걸리지 않았 으므로이 경우 키스 나 Yagni 교장에서 너무 멀리 탐색하지 않았다고 생각합니다. :-)

나는 여전히 운영에 대한 타이밍 관련 문제의 여지가 있다고 생각하지만 저장소 구현에서이를 해결할 수 있어야합니다. 이상적인 솔루션은 아니지만 고치는 데 걸리는 시간보다 적은 시간에 피할 수있는 문제를 해결하기 위해 휠을 재창조 할 가치가 있는지 확실하지 않습니다.

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