2016-07-06 3 views
3

저는 회사에서 대부분의 LOB 항목을 관리하는 응용 프로그램을 구축하고 있습니다. DDD에서 머리를 감싸려고 노력 중입니다. 고객 관리부터 시작합니다. 많은 예제는 도메인 모델과 관련하여 매우 도움이되지 않는 매우 간단합니다.DDD 고객, 연락처 및 주소 (집계 루트)

내 집계 루트는 주소록 (주소록), 연락처 모음 및 통신 기록 모음을 포함하는 고객 클래스입니다.

주소록, 연락처 (전화 번호 x 개를 가질 수 있음) 및 통신 기능을 갖춘이 집계 루트가 거대한 것 같습니다.

E.G.

UpdateCustomerName(...) 
SetCustomerType(...) // Business or individual 
SetProspect(...) // if the customer is a prospect 
SetDefaultPaymentTerms(...) // line of credit, etc. for future orders 
SetPreferredShippingMethod(...) // for future orders 
SetTaxInfo(...) // tax exempt, etc. 
SetCreditLimit(...) 
AddAddress(...) 
RemoveAddress(...) 
UpdateAddress(...) 
VerifyAddress(...) 
SetDefaultBillingAddress(...) 
SetDefaultShippingAddress(...) 
AddContact(...) 
UpdateContact(...) 
RemoveContact(...) 
SetPrimaryContact(...) 
AddContactPhoneNumber(...) 
RemoveContactPhoneNumber(...) 
UpdateContactPhoneNumber(...) 
AddCommunication(...) 
RemoveCommunication(...) 
UpdateCommunication(...) 
etc. 

나는 값 개체가 신원을 가지고 있지 않다는 것을 읽었습니다. 이 시스템에서 각 (데이터베이스의) 주소는 ID를 가지며 customerId를 외래 키로 갖습니다. Address가 자신의 집계 루트 인 경우 기본 청구/출고를 설정하는 데 비즈니스 로직을 사용할 수 없습니다. 많은 예제는 ID가없는 값 객체를 가지고 있습니다 ... 나는 그것없이 Customer 테이블의 변경 사항을 유지하는 방법을 모릅니다.

누구나 내 구조가 잘못된 길을 지나가고있는 것처럼 느껴진다. 누구나 비슷한 것을합니까? 구조를 분석하고 기본 비즈니스 규칙을 유지하는 방법 (주소가 고객에게 기본 청구 또는 운송으로 설정되기 전에 할당되었는지 확인하는 방법)을 잘 모릅니다.

답변

4

비즈니스 논리가 어디에 있어야하는지에 대한 문제를 해결하는 이유는 한정된 컨텍스트를 혼합하기 때문입니다.

  • 고객 서비스
  • 청구
  • 배송
: 로브 응용 프로그램은 여러 경계 상황으로 나누어 응용 프로그램을 보여 대부분의 DDD에있는 전형적인 예 중 하나입니다

각 바운드 컨텍스트에는 고객 클래스의 일부 정보가 필요할 수 있지만 대부분은 그렇지 않습니다. DDD는 엔티티의 정의에 접근 할 때 표준 DRY 개념을 위반합니다. 여러 Customer 클래스가 정의되어 있어야합니다. 하나의 Customer 클래스는 정의 된 각각의 컨텍스트에 대해 하나씩 정의됩니다.

  • 고객 서비스 : 정보, 연락처 역사에 문의
  • 결제 : 대금 청구 주소, 지불 정보, 주문 각각의 경계 맥락에서, 당신은 그 경계 컨텍스트 내에서 요구 사항을 충족하기 위해 속성과 비즈니스 로직 클래스를 정의 할
  • 배송 : 라인 항목, 배송 주소

이 경계 컨텍스트 할 수있는 동일한 데이터베이스 또는 시스템의 복잡성에 따라 여러 데이터베이스, 모든 점. 동일한 데이터베이스 인 경우 데이터 액세스 계층을 설정하여 바운드 컨텍스트에 필요한 속성을 채 웁니다.

스티브 스미스 (Steve Smith)와 줄리 ​​루만 (Julie Lerman)은 Pluralsight에서 이러한 개념을 깊이있게 다루는 환상적인 도메인 중심 디자인 기초 과정을 제공합니다.

+2

위대한 설명. 고맙습니다. –

+0

이제 별도의 경계 컨텍스트에서로드 된 데이터 모델간에 동기화하는 방법을 알아야합니다 (이벤트 소싱을 사용하지 않고 있음). E.G. 대금 청구 고객 도메인 모델에는 주소 목록이 있어야 할당되는 기본 대금 청구 주소가 실제로 존재합니다 ... 그러나 주소는 고객 서비스의 제한된 컨텍스트에서 관리됩니다 –

+0

업데이트 기능은 해당 업데이트가 발생하는 컨텍스트에 있어야합니다 . 요점은 기본 청구서 수신 주소를 채우기위한 등록 정보 만있는 청구 컨텍스트 모델을 작성할 수 있다는 것입니다. 결제 환경에 업데이트가 없으면 해당 기능이 필요 없습니다. – Larry