2017-04-23 3 views
0

일부 DDD 개념을 적용하려고하고 있는데, 엔티티가 자체 메소드를 호출하거나 사용자 (액터)가 그렇게하는 것이 더 합리적인 이유가 궁금합니다.엔티티가 자체 동작을 호출하거나 배우를 수행합니까?

예를 들어 Appointment 엔티티가 있다고 가정 해 보겠습니다. 사용자는 해당 약속의 소유자 인 경우에만 약속을 취소 할 수 있습니다 (따라서 해당 작업을 허용하기 전에 사용자에게 적절한 권한이 있는지 확인해야합니다). 우리는 두 가지 방법의 하나를 수행 할 수 있습니다 제한된 상황은 "약속"입니다

pseudocode 

// method #1 
User.Cancel(a *Appointment) result 

// method #2 
Appointment.Cancel(u *User) result 

을하지만 사용자가 다른 방법으로 주위보다 실체에 행동을 호출하기 위해 더 많은 의미를 보인다. 어느 쪽이 더 낫고 왜 그럴까요?

답변

1

먼저 Aggregate root (AR), User 또는 Appointment이 무엇인지 확인해야합니다. 보호되어야하는 비즈니스 불변 변수를 검사해야하는지 결정하려면 트랜잭션 경계가 무엇인지 확인해야합니다. 아주 좋은 기사 here가 있습니다. AR은 모든 하위/중첩 엔티티에 액세스하는 데 사용되는 엔티티입니다.

디자인에 따라 AR과 하위 엔티티 (디자인에 다른 엔티티) 또는 두 개의 ARs이 있습니다.

그런 다음 구멍 개체가 아닌 다른 엔터티의 ID 만 지정하여 집계에 대한 명령 메서드에 액세스합니다.

User.Cancel(aId *AppointmentID) 

Appointment.Cancel(uId *UserID) 

또는

지금, 권한 검사 자연스럽게 집계에 속하지 않는 일반적인 행동입니다. 이 확인은 메서드가 호출되기 전에 수행됩니다. 집계 디자인은이 허가 사항에 의해서만 영향을 받아서는 안됩니다. 예를 들어 비서는 참가자뿐 아니라 약속을 취소 할 수 있습니다. 허가 확인은 다른 bounded context에 있습니다. 지금까지 도메인에서 이해하는 것과

는 약속은 AR해야하며, 코드는 다음과 같이한다 : 당신이 CQS 패턴을 따르는 경우

Appointment.Cancel(byWhom *UserID) 

마지막으로 한가지, 그 방법은 반환하지 않습니다 아무것도.

+0

답변 해 주셔서 감사합니다. 권한 검사가 집합체에 속하지 않는다고 말할 때를 제외하고는 모든 것이 명확합니다. 나는 집계가 도메인 지식을 캡슐화하고 불변성을 강제하기위한 것이라고 생각했습니다. 귀하의 예를 사용하기 위해, 비서실 도메인 객체가 할 수있는 일과 할 수없는 일을 'AR'로 약속하지 않아야합니까? – user7467314

+1

권한 부여는 교차 관심사이므로 일반적인 하위 도메인입니다. 에릭 에반스 (Eric Evans)의 DDD 책, DDD 구현 책 및 다른 모든 출처에서이 책은 또 다른 BC로서의 구현 자입니다. http://stackoverflow.com/a/23485141/2575224에서 더 많은 내용을 보거나 google에서 "permission ddd"를 검색하면됩니다. –