2017-03-10 1 views
0

다음과 같은 시나리오를 생각해 봅시다 Order 집계를 만든 후에, 우리는 특정 라인 항목에 할인을 추가 할 시나리오에서DDD - Aggegrate 메서드 뒤에 집계, 호출 메서드 또는 엔터티 메서드 숨기기를 통해 엔터티 가져 오기?

class Order: 

    def __init__(self): 
     self.lines = [] 

    def order(self, product_id, amount, price, discount=None): 
     item = OrderItem(product_id, amount, price) 
     self.lines.append(item) 

class OrderItem: 

    def __init__(self, product_id, amount, price, discount=None): 
     self.product_id = product_id 
     self.amount = amount 
     self.price = price 
     self.discount = discount or decimal.Decimal(0) 

    def discount(self, amount): 
     self.discount = discount 

을, 나는 집계에서 OrderItem 개체를 얻을 필요가 수행 또는 집계에 메소드를 공개 할 수 있습니까?

예.

class Order: 

    ... 

    def discount_item(self, index, amount): 
     self.lines[index].discount(amount) 

내가 호출 할 경우 OrderItem.discount() 직접 - 어떻게 그 결과로 발표 된 도메인 이벤트를 추적합니까?

답변

1

집합에 대한 모든 변경은 집계 루트의 공용 메서드를 통해 수행해야합니다. 이렇게하면 집계가 항상 일관된 상태인지 확인할 수 있습니다. 그렇지 않으면 집계의 내부 엔티티를 수정하여 집계의 일관성을 쉽게 깨뜨릴 수 있습니다. 전체 집계 개념은 모든 내부 개체와 값 개체를 유효한 상태로 유지하는 것입니다. 이 규칙을 따르는 경우에

def applyDiscountForItem(self, itemPosition, amount): 
    // apply the discount on item identified by itemPosition 

이 집계의 일관성을 보장 : 그래서, 당신의 경우에 당신은 Order 집계 루트에이 방법과 유사한 방법을 추가 할 수 있습니다. 집계 루트는 집계를 변경하는 단일 진입 점이므로 모든 비즈니스 로직과 유효성 검사를 루트에 쉽게 추가 할 수 있습니다. 그러나 집계가 커지면 루트에 "프록시"메소드가 많이있을 수 있습니다. 그렇다면 집계가 너무 커져서 여러 집계로 분할해야합니다. 일반적으로 집계를 상대적으로 작게 유지하는 것이 좋습니다. 종종 가장 좋은 집계는 하나의 엔터티 (집계 루트 자체)와 다중 값 개체로만 구성됩니다.