저는 최근에 DDD를 살펴보기 시작했고 오래된 개인 프로젝트를이 패턴으로 리팩토링했습니다. 나는 Evans 청서의 중간 정도에 있으며, 거기에 대한 답변을 찾을 수 없을 것입니다.DDD Repo-repo.findByChildId (id) AND repo.transferChild (to, from, child)
기본적으로 내 응용 프로그램은 재고 추적 장치입니다. 인벤토리에는 항목 모음이 포함되고 항목은 인벤토리간에 전송 가능한 항목입니다. 인벤토리에는 transferIn() transferOut()
과 같은 메소드가 있습니다. 여기에는 인벤토리가 이미 가득 차 있지 않은지 또는 항목이 양도 할 수있는 상태인지 확인하는 등의 유효성 검사 로직이 포함됩니다. 이러한 제약 때문에 인벤토리가 집합 루트이고 해당 항목이 엔티티라고 믿게됩니다.
1) 사용자가 인벤토리에 대해 특정 항목 엔티티를 요청한 경우 현재 해당 항목이있는 인벤토리를 반환하는 inventoryRepo.findByItemId(id)
을 갖고 싶습니다. 서비스를 통해
2)과 같이 수행합니다 :
boolean requestItemTransfer(destInvId, itemId){
Inv from = invRepo.findByItemId(itemId);
Inv to = invRepo.findById(destInvId);
from.transferOut(itemId);
to.transferIn(from.getItem(itemId));
return invRepo.transferChild(to, item); //Edited
}
은 기본적으로 재고 클래스 (풍부한 도메인 모델 내 검증 로직을 작성)를 다음 예외가없는 경우 나는 REPO를 사용하는 나는 할 수 있도록 .transfer() 메서드를 사용하여 변경 내용을 유지합니다.
DDD를 위반합니까? 더 나은 대안이 있습니까?
내가 읽은 것에서 이것은 틀에 박힌 경우에만 유효하다고 보았습니다. 내가 찾은 모든 예제는 1 개의 루트 인스턴스 내에 만 존재할 수있는 엔티티를 보여줍니다. 또한 은행 계좌 이체 예가 있지만 값 개체 인 금액을 처리하고 송금 저장소가 있습니다. 송금이 특정 시나리오에 기록되기 때문에 광산에는 저장되지 않기 때문입니다.
편집 : 사용 사례는 다음과 같습니다 :
1) 사용자가 자신의 재고와 그 항목의 목록을 요청합니다.
2) 사용자는 1 개의 인벤토리에서 1 개 이상의 항목을 선택하고 다른 인벤토리로 전송하도록 요청합니다. 이것은 내 TransferService가 들어 와서 지정된 재고 목록에서 txIn 및 txOut을 조정하고 repo를 통해 이러한 변경 사항을 유지합니다. 인프라 서비스가되어야할까요? 그게 분명하지 않다.
3) 사용자는 해당 항목이 현재있는 인벤토리의 목록과 관련하여 인벤토리로 전송할 수있는 항목 집합을 미리 정의합니다. TransferService는 현재 항목이있는 위치를 찾고 유스 케이스 2에서와 같이 나머지 부분을 조정합니다 .
EDIT2 : repo.transfer 정보 사실 이것은 제약 조건입니까/최적화입니까? 데이터 측면에서부터 내가 말한 것에서는 항목을 찾아보고 가리키는 인벤토리 ID를 변경합니다. 이것은 품목이 즉시 2 개의 재고 목록에있을 수 없기 때문입니다. 그러므로 repo.update(fromInvInNewState)
과 repo.update(toInvInNewState)
대신 인벤토리의 전체 상태 (모든 항목이 이동하지 않았으며 상태의 나머지 부분은 해당 위치에있는 항목에서 파생되기 때문에 다시 작성하지 않으므로 repo.moveChild(toInv, child)
이 있습니다) 포인트), 일부 항목을 주변으로 이동하십시오.
에반스와 버논의 책을 막 완성했습니다. 나는 당신의 답변에 동의하지만 또 다른 질문이 떠올랐다. 나는 사용자가 AR이고 인벤토리 인스턴스의 불변량을 처리하는 것에 동의합니다. 이제 문제는 일부 인벤토리가 사용자간에 공유된다는 것입니다. 팀은 공통 인벤토리를 보유하고 있으며 각 구성원마다 자체 인벤토리가 있습니다. 따라서 흐름은 User1이 항목을 공통 인벤토리로 전송하고 User2가 공통 인벤토리에서 항목을 가져옵니다. 엔티티 인스턴스가 그런 집계를 통해 공유 될 수 있습니까? 아니면 팀을 모델링해야한다는 뜻입니까? transfer() 메소드를 호스팅하는 사람은 누구입니까? – jam01
일반 인벤토리를 사용자 이전 방법으로 전달했을 수 있습니까? – jam01