2009-06-10 2 views
12

나는 집계와 뿌리를 고민하고있다. 나는 사용자 요청의 약 60 %에서 작동하는 자연 집계 루트를 가지고있다. 나는. 이러한 요청은 당연히 집계 루트에 적용됩니다.도메인 기반 디자인 - 집계 루트

내 집계 내에 집계 루트의 멤버로만 존재할 수있는 다른 엔터티가 있습니다. 그러나 사용자는이 다른 엔터티 개체에 대해 알려줍니다. 개념적으로 사용자가이 집계되지 않은 루트 개체를 직접 조작하는 것이 의미가있을 수 있습니다.

그래서, 나는 몇 가지 옵션이 있다고 생각 :

  1. 을 그들은 모두 작업이 사용자에 의해 요구되고있는에 따라 집계 뿌리가 될 수 있습니다.
  2. 모든 작업은 최상위 집계 루트를 거쳐야합니다.

상위 수준 집계 루트는이 다른 엔터티의 컬렉션을 보유합니다.


예 :

홈페이지 집계 루트 : 자동차

두 번째 엔티티 : 좌석 (A 자동차 종류에 따라 중 2 또는 4 석). 내 도메인에서 좌석은 자동차의 일부로 만 존재할 수 있습니다.

도메인의 대부분의 작업은 자동차 수준입니다. 그래서 이것은 집계 루트의 좋은 후보가 될 것입니다. 그러나 (예를 들어 여기서 고심하고 있습니다.) 일부 작업은 시트 레벨에 있습니다 (예 : SpillCoffee, ChangeFabric, Clean ....

시트 및 자동차 모두 골재 뿌리가 될 수 있습니까? 아니면 항상 자동차로 시작해야합니까?

감사

답변

13

집합의 개념은 데이터 무결성 및 강제 불변의 루트 책임있는, 일관성을 보장하는 것입니다.

"모든 좌석의 패브릭은 동일해야합니다."또는 "차안에 누군가가있을 경우에만 좌석에 커피를 엎질 수 있습니다"와 같은 규칙이 있다고 가정하면 이러한 사항을 시행하기가 훨씬 어려울 것입니다 클라이언트는 패브릭을 개별적으로 변경할 수 있거나 이러한 불변성을 외부 (위험 영역)에서 강제로 수행해야합니다. (위험 영역)

IMHO, 무결성 또는 강제 불변성이 문제가되지 않는다면 실제로 집계는 필요하지 않지만, 필요한 경우, 내 충고는 자동차로 모든 것을 시작하는 것입니다. 그러나 항상 모델을 생각해 봅니다. 이러한 불변성이있는 경우이 불변성을 적용하는 사람은 누구입니까? 코드에이 아이디어를 전달하면 모든 것이 잘됩니다.

1

장바구니 및 광고 항목이있는 장바구니의 경우 자주 개별적으로 수정하기 때문에 두 가지 모두 집계 루트로 사용합니다.

public class Cart : IAggregateRoot 
{ 
    public List<LineItem> LineItems {get;} 
} 

public class LineItems : IAggregateRoot 
{ 
    public List<LineItem> LineItems {get;} 
} 

그러나, 나는 주문에 대한 별도의 경계 컨텍스트가이 경우에 나는 단지 내가 더 이상 독립적으로 개별 항목을 수정해야하기 때문에 하나 개의 집계 루트가 없다 할 필요가있다.

public class Order : IAggregateRoot 
{ 
    public List<LineItem> LineItems {get;} 
} 

다른 옵션은 하위 ID에서 집계 루트를 찾는 것입니다.

Car GetCarFromSeatID(guid seatID) 
2

아마도 도메인 모델의 일부 측면에 대한 더 깊은 지식이 필요합니다. 이 질문은 시스템을 제공하기 위해 엔터티를 구성하는 방법을 발명하려고하고 있음을 보여줍니다. 이러한 유형의 질문은 이상적으로 구현하기 전에 이미 응답 한 경우에 이상적입니다.

도메인이 다시 실행되는지 여부는 도메인을 검토하기 위해 되돌아 가야하는지 또는 도메인의 리치와 모델을 개선하기 위해 비즈니스의 관련 세부 사항에 대한 의견을 수렴 할 수있는 취약성을 발견했는지 여부 .

자동차 예에서는 여러 컨텍스트를 상호 연관시키는 두 개의 집계 방식을 사용했습니다. 첫 번째는 "자동차 좌석"접근 방식이며,이 총계에서 "좌석"에 대한 가능한 조치는 "자동차의 일부로 자리 잡기"에 적합 할 것입니다. 예 : 청소하십시오.

두 번째 집계는 "좌석"의 컨텍스트에 있으며 독립 실행 형으로 자리에 대한 가능한 동작과 구성이있을 수 있습니다. 예 : ChangeFabric, ColorList. 이렇게하면 집계 된 "자동차"에는 "좌석"이 있지만 클라이언트는 의미있는 자리에 자리를 알 수 있습니다. 이전 게시물에서 samuelcarrijo가 말했듯이 위험합니다. 컨텍스트 간의 수정이 도메인 무결성에 영향을 주면 모든 집계 개념을 잃게됩니다.

관련 문제