2017-02-22 1 views
2

일부 상점에서는 백엔드를 구현 중이며, 프론트 엔드에서 완전히 작성되었으며 최종 상태 (데이터) 만 백엔드로 전송됩니다. DDD를 CQRS/ES와 함께 사용하려고합니다. (예를 들어, 일반화)현재 명령이 필요하지 않다면 큰 명령을 작은 명령으로 분해하는 것이 유리합니까?

해피 시나리오 쓰임새 :

  • 사용자, 장바구니 및 CartItem이있는 점을 감안.
  • 사용자

  • 사용자가

  • 사용자가 주소를 선택할 수 있습니다

  • 사용자 유형의 Y를 CartItem을 추가 할 수 있습니다 CartItem Y의 지정 (일부 PARAMS 설정) 할 수 있습니다 쇼핑 카트에 형 X의 CartItem을 추가 할 수 있습니다 그의 adresses에서 (그들을 만드는 것은 다른 BC의 )

  • 사용자가 주문할 수 있습니다

이제 모든 것이 프론트 엔드에서 발생하므로 내 유일한 전달 메커니즘은 이제 GraphQL의 일부 원시 데이터입니다. 내가 응용 프로그램 레이어에서 CreateNewOrderFromGraphQL 메소드 ($ someGraphQLData)를 가지고 있어야합니까? 그건 단지 상대적으로 큰 CreateNewOrderCommand를 생성하기 때문에 (주소, CartItems, 프로모션 코드 등을 포함해야하기 때문에) 명령 버스를 통해 전체 주문을 생성하는 내 도메인 모델로 전달합니까?

또는 내 도메인 모델을 프론트 엔드에서와 같은 방식으로 생각해야하며, 그 다음 CreateNewOrderFromGraphQL에서 CreateCartCommand, AddItemToCartCommand, CreateOrderCommand (카트 ID, 주소 ID , 그리고 어쩌면 몇 가지 세부 사항) 순차적으로 호출 할 수 있습니까?

내가 고려해야 할 사항은 무엇입니까?

+0

귀하의 불변량은 무엇입니까? 어떤 조건에서 '주문'을 만들고 배치 할 수 있습니까?'Aggregate''의 불변량을 기반으로 명령을 만들어야합니다. –

+0

@ ConstantinGALBENU 1) 주어진 id의 사용자가 존재하는 경우 2) 주어진 id의 주소가 존재하는 경우 3) 장바구니가 유효하다면, 주문 장바구니의 각 CartItem이 자신의 불변 값을 전달한 것을 의미합니다. 그래서, 그것을 깨는 것이 더 현명하다고 가정합니다. 그래서 먼저 장바구니를 만든 다음, 하나씩 항목을 추가하고 결국에는 장바구니의 ID를 순서대로 전달할 수 있습니다. 그렇다면 결국 모든 항목이있는 전체 주문을 생성하지 못하게하는 대신 장바구니를 만드는 동안 (그리고 아마도 많은 단계에서) 특정 항목에 대한 오류를보고 할 수 있습니다. – Tom

+0

프런트 엔드를 제어 할 수 있습니까? 이상적으로 DDD를 사용하면 사용자의 의도가 UI의 작업과 백엔드에 해당합니다. 그렇게 할 수 없다면 나는 할 수있는 것처럼 실제로 노력할 것이고 프론트 엔드를위한 외관을 만들어 프론트 엔드를 마치 명령 자체를 생성하는 것처럼 보이게 만들 것이다. 어느 날 하루 프론트 엔드는 이상적인 상황으로 업데이트/업그레이드 될 수 있지만, 그렇지 않은 경우 백엔드는 영향을받지 않습니다. – Arwin

답변

2

프런트 엔드에서 많은 동작이 발생하고 프런트 엔드를 신뢰할 수 없기 때문에 백 엔드에서도 동작을 복제해야합니다. 그래서 여기에 무엇이 있는지 보겠습니다.

GraphQL 인터페이스가 UI의 종류 인 UI 무신론자가되도록 도메인 모델 (명령면)을 디자인해야한다고 생각합니다.

따라서 사용자가있는 경우 요청 승인 단계에서 이미 수행했는지 확인하십시오. 사용자가 존재하지 않으면 클라이언트 요청이 도메인 모델에 도달해서는 안되며 응용 프로그램 계층 (또는 UI와 도메인 사이에있는 유사한 계층)에 의해 거부되어야합니다.

카트는 다른 Aggregate으로 수행 될 수 있습니다. CreateCartCommandAddItemToCartCommand과 같은 명령을 사용해야합니다. 실제 불변량이 없다면 CRUD로 수행 될 수 있습니다.

다음, OrderAggregate 이미 응용 프로그램 계층에서 존재를 확인하는 인수로 카트에서 항목과 PlaceOrderCommandAddressIdUserId있을 수 있습니다. 이 Aggregatetotal price <= some max value과 같은 자체 불변성을 보호하거나 인벤토리 상태를 확인합니다 (인벤토리가 다른 BC에없는 경우).

관련 문제