그룹과 사용자가 있고 사용자가 그룹에 가입하려고 할 때 groupsService.AddUserToGroup (group, user) 메서드를 호출한다고 가정 해 봅시다. DDD에서는 group.JoinUser (user)를 수행해야합니다.
그러나 DDD는 현재 수행중인 작업이 너무 복잡하거나 엔터티 모델에 맞지 않을 경우 (상태 비 저장) 서비스를 사용하여 작업을 수행하도록 권장합니다. 도메인 계층에 서비스를 제공해도됩니다. 그러나 도메인 계층의 서비스에는 비즈니스 논리 만 포함되어야합니다. 반면에 외부 작업 및 전자 메일 전송과 같은 응용 프로그램 논리는 응용 프로그램 계층에서 도메인 서비스를 사용해야합니다. 예를 들어 별도의 (응용 프로그램) 서비스가있을 수 있습니다.
사용자를 추가하기위한 유효성 검사 규칙이 있으면 문제가 발생합니다 ...
유효성 검사 규칙은 도메인 모델에 속합니다! 도메인 개체 (엔티티 등) 안에 캡슐화해야합니다.
또는 사용자가 그룹에 추가 될 때 일부 외부 작업을 시작해야합니다. 이러한 작업을 수행하면 엔터티가 외부 종속성을 갖게됩니다.
어떤 종류의 외부 작업에 대해 알지 못하지만 이메일을 보내는 것과 같은 것으로 가정합니다. 그러나 이것은 실제로 도메인 모델의 일부가 아닙니다. 응용 프로그램 계층에 있어야하며 imho에 저장해야합니다. 응용 프로그램 계층에 도메인 서비스 및 엔터티에서 작동하여 해당 작업을 수행하는 서비스가있을 수 있습니다.
그러나 엔터티가 일부 외부 서비스 / 클래스에 의존한다는 사실은 나에게 좋지 않고 "자연스러워"보입니다.
부자연스럽고 일어나지 않아야합니다. 실체는 책임이 아닌 것을 알지 않아야한다. 엔티티 상호 작용을 조정하기 위해 서비스를 사용해야합니다.
DDD에서 이것을 처리하는 올바른 방법은 무엇입니까?
귀하의 경우 관계는 아마도 양방향이어야합니다. 사용자가 그룹에 참여하는지 또는 그룹이 사용자를 참여하는지는 도메인에 따라 다릅니다. 사용자가 그룹에 참여합니까? 또는 사용자가 그룹에 추가 되었습니까? 도메인에서 어떻게 작동합니까?
어쨌든 양방향 관계가 있으므로 사용자가 사용자 집계 내에서 이미 속한 그룹의 수를 결정할 수 있습니다. 담당 클래스를 결정한 후에는 사용자를 그룹으로 전달하거나 그룹을 사용자에게 전달하는지 여부는 기술적으로 사소한 것입니다.
그런 다음 엔터티에서 유효성 검사를 수행해야합니다. 모든 것은 응용 프로그램 계층의 서비스에서 호출되며 전자 메일 보내기와 같은 기술적 인 작업도 수행 할 수 있습니다.
그러나 유효성 검사 논리가 실제로 복잡한 경우 도메인 서비스가 더 나은 솔루션 일 수 있습니다. 이 경우 비즈니스 규칙을 캡슐화 한 다음 응용 프로그램 계층에서 호출하십시오.