2016-08-25 2 views
0

다음 예에서 _customRoleRepository을 구현하는 데 권장되는 방법은 무엇입니까? 응용 프로그램 서비스에서 다음 코드가 실행됩니다.DDD 저장소 입력 매개 변수

var user = _userRepository.GetById(1); 
var customRole = _customRoleRepository.GetById(user.CustomRoleId); 

또는

var user = _userRepository.GetById(1); 
var customRole = _customRoleRepository.GetForUser(user); 
+0

을 무엇인가 사용자와 역할이로드되고 있습니까? – tomliversidge

+0

@tomliversidge 인증 토큰을 생성하고 해당 토큰에 연결할 역할 권한을 부여하려면 – Robert

답변

1

주어진 두 가지 옵션을 사용하면 ID로 액세스하는 일관성을 유지하는 첫 번째 옵션으로 전환 할 수 있습니다.

특히 사용자가 데이터베이스를 왕복하지 않도록 사용자를로드 할 때 사용자 지정 역할을로드하는 것이 좋습니다 (특히 일반적인 작업 인 경우). 이것은 읽기 모델로 구현 될 수 있습니다.

+0

CQRS와 같은 것? – Robert

+1

전문 용어는 당신이 이야기하는 사람에 따라 달라질 수 있습니다 :)하지만 나는 종종 응답에 필요한 읽기 모델에 미리 투영되는 읽기 용 데이터 저장소가있는 경우 CQRS (명령 쿼리 책임 분리)라는 용어를 사용합니다. 이벤트 스트림에 따라 비동기 적으로 최신 상태로 유지됩니다. 그러나 똑같이 유효한 또 다른 기법은 쓰기 모델 지속성 저장소에 대해 표준 쿼리를 실행하는 쿼리 집합이있는 CQS (명령 쿼리 분리)입니다. 응용 프로그램에서 쿼리가 _ 분리되어 있지만 읽기 모델이 완전히 분리되어 있지 않습니다. –

+0

저에게있어서, 단순히 사용자 테이블을 CustomRoles 테이블에 조인하고 읽기 모델 dto를 반환 한 읽기 모델 쿼리를 구현하면 CQS가됩니다. 또한 데이터가 UI 또는 API 응답 데이터까지 곧바로 올라가는 것이 좋은 생각이라고 생각합니다. 도메인 집계/엔티티와 상호 작용하기 위해 반환 된 데이터를 사용하려는 경우 도메인 모델로 도메인 모델을 사용하고 액세스 전략을 독립적으로 유지하기 때문에 리포지토리에서 수행하는 작업이 더 좋습니다. –

0

증오는 대답하지만 DDD 환경에서, 내 대답은 '아니 될 것입니다.

첫 번째 예에서는 역할 저장소가 사용자 도메인을 잘 모르는 경우가 있지만 응용 프로그램이 사용자의 ID를 가져 와서 다른 저장소를 쿼리하는 데 필요한 역할을 알아야한다는 것을 의미합니다 . 즉, 응용 프로그램은 사용자와 역할 사이의 매퍼 (mapper) 역할을합니다.

두 번째 예에서 역할 저장소는 이제 사용자 도메인에 대해 알아야합니다. 그다지 좋지는 않지만 다른 한편으로 애플리케이션은 더 이상 roleId에 대해 알 필요가 없습니다. 그래서 그것은 좋다. 두 가지 접근 방식 사이의 고전적인 거래.

두 경우 모두 응용 프로그램은 정보를 얻기 위해 여전히 두 개의 저장소가 필요합니다. 더 많은 관계가 필요할 때 어떻게됩니까? 리포지토리의 수는 빠르게 증가하고 모든 것이 엉망이됩니다.

도메인 기반 디자인에서는 집계 루트 (AR)와 도메인 컨텍스트를 고려해야합니다. 예제 컨텍스트에서 사용자는 AR이고 역할은 하위가됩니다. 그래서 당신이있을 수 있습니다

하면 응용 프로그램에서 구현 세부 사항의 대부분을 숨기고 도메인 엔티티가 실제로 무엇을해야하는지에 초점을 맞출 수
var user = _userFinder.GetById(1); 
var customRole = user.CustomRole; 

.

+0

CustomRole은 BC 내의 다른 AggregateRoot를 나타냅니다. 그것에는 엔티티 (권한)가 있습니다.다중 사용자는 동일한 CustomRole을 공유 할 수 있습니다. 당신이 제안한 것은 CustomRole을 값 객체로 취급하는 것이고, CustomRole이 업데이트되면 해당 역할 내의 모든 사용자에게 변경 사항을 전파해야합니까? – Robert

+0

동일한 bc 내의 두 개의 ar은 문제가있는 것처럼 들립니다. 귀하의 예에서는 역할이 가치 객체라고 생각합니다. 역할을 업데이트하기 위해 다른 기원전을 사용하고 사용자에게 역할이 변경되었음을 알리는 알림을 보냅니다. 물론 이것의 많은 부분은 실제로 처리해야 할 복잡한 비즈니스 로직이 있는지에 달려 있습니다. 큰 그림을 모른 채 구체적인 권장 사항을 만들기가 어렵습니다. – Cerad

+0

그런데 이런 종류의 질문은 http://programmers.stackexchange.com/ – Cerad

1

: ... 당신이 제대로 집계를 모델로 한 추정되고 모두 필요에 따라 동일하게 유효합니다. GetForUser은 역할을 시도하기 전에 호출 코드에 유효한 User 집계가 있는지 확인하려는 경우 유용 할 수 있습니다. 호출 코드가 유효한 코드를 요구하도록하려면 customRoleRepository와 User 집계를 연결해야합니다. 사용자 집합체는 그 커플 링에 목적이 있습니다.

GetByUserIdGetById 더 일관성이 적은 커플 링이 있으므로 클라이언트가 유효한 사용자 집합이없는 경우에도 사용자의 컨텍스트에서이 GetByUserId를 호출 문제가되지 않는 경우에, 그 너무 괜찮아요.

당신이 ById을로드하는 경우, 나는 또한 안전한 형태의 추가 수준의 제공에 매우 도움이 될 수있는 입력 신원 valueobjects를 사용하여 발견 한 - 여기 찬반 여기 단점 https://stackoverflow.com/a/5377460/6720449에 대한 몇 가지 대화와 https://groups.google.com/forum/#!topic/dddcqrs/WQ9zRtW3Gbg