먼저 글의 길이에 대해 사과하는 것으로 시작하겠습니다.하지만 실제로 많은 세부 사항을 미리 전달하고 싶기 때문에 의견에 앞뒤로 시간이 걸리지 않습니다.
저는 DDD 접근 방식에 따라 응용 프로그램을 설계하고 있으며, Aggregate Root에 다른 AR이 포함되어야하는지 또는 별도의 "자립형"AR로 남겨 져야하는지 결정하기 위해 어떤 지침을 따를 수 있는지 궁금합니다.
직원들이 하루 종일 시계를 켤 수있는 간단한 시계 응용 프로그램을 예로 들어 보겠습니다. UI를 사용하면 직원 ID 및 PIN을 입력 한 다음 유효성을 검사하고 직원의 현재 상태를 검색 할 수 있습니다. 직원이 현재 시간을 측정 한 경우 UI에 "Clock Out"단추가 표시됩니다. 반대로, 클럭이 맞지 않으면 버튼에 "Clock In"이 표시됩니다. 버튼으로 수행 한 작업은 직원의 상태에도 해당합니다.
애플리케이션은 RESTful 서비스 인터페이스를 통해 노출 된 백엔드 서버를 호출하는 웹 클라이언트입니다. 직관적이고 읽을 수있는 URL을 만드는 첫 단계는 다음과 같은 두 가지 끝점으로 이루어졌습니다.
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
참고 : 직원 ID 및 PIN의 유효성이 검사되고 "사용자"를 나타내는 "토큰"이 헤더에 전달 된 후에 사용됩니다. 이는 관리자 또는 감독자가 다른 직원을 시계로 출입 할 수있는 "관리자 모드"가 있기 때문입니다. 그러나이 토론을 위해 간단하게 유지하려고합니다.
서버에는 API를 제공하는 ApplicationService가 있습니다. ClockIn 메서드에 대한 나의 초기 아이디어는 다음과 같습니다.
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
직원의 시간 카드 정보가 실제로 거래 목록으로 유지된다는 것을 알 때까지는 매우 간단합니다. 즉, ClockIn 또는 ClockOut을 호출 할 때마다 직원의 상태가 직접 변경되지 않고 대신 직원의 TimeSheet에 새 항목이 추가됩니다. 직원의 현재 상태 (시간 기록)는 TimeSheet의 가장 최근 항목에서 파생됩니다.
따라서 위의 코드를 사용하면 내 저장소는 Employee의 지속 가능한 속성이 변경되지 않았지만 새로운 항목이 Employee의 TimeSheet에 추가되어 데이터 저장소에 삽입을 수행한다는 것을 인식해야합니다.
반면 TimeSheet는 집계 루트 인 것처럼 보이고 정체성 (직원 ID 및 기간)을 가지고 있으며 TimeSheet와 동일한 논리를 쉽게 구현할 수 있습니다. (직원 ID).
나는 두 가지 접근법의 장점에 대해 스스로 토론하고 있으며, 첫 문단에서 언급했듯이 어떤 접근법이 문제에 더 적합한지를 결정하기 위해 어떤 기준을 평가해야하는지 궁금합니다.