2017-09-06 1 views
1

Order 집계가 주어지면 Order W OrderItem으로 구성됩니다. 순서는 집계 루트입니다. 주문을하는 것은 데이터 일관성을 위해 트랜잭션을 요구하는 유일한 시나리오입니다. 또는 적어도 트랜잭션을 필요로하지 않는 orderItem과 orderItem에서 데이터를 변경하는 시나리오가 많이 있습니다.집합에서 모든 데이터 변경이 트랜잭션에 있어야하는 이유는 무엇입니까?

DDD가 실행되기 전에 트랜잭션은 메소드를 만드는 동안 결정됩니다. 일관성을 유지하기 위해 일반적으로이 방법이나 동작이 트랜잭션에 있어야하는지 생각합니다.

DDD는 집계 루트에 의해 노출 된 모든 가능한 동작에 대한 트랜잭션을 제안합니다. 실제로 교착 상태가 더 심해질 수 있습니다.

나는 모든 데이터가 트랜잭션에서 집계 루트의 동작을 변경하지 않아도된다고 생각합니다.

예를 들어 배송 세부 정보 만 변경하면 거래가 필요한 이유가 무엇입니까? 주문 항목 만 삭제하는 경우 거래가 필요한 이유는 무엇입니까? 따라서 Order.UpdateOrder 및 Order.DeleteOrderItem 메서드의 경우 트랜잭션을 고려하지 않아야합니다.

내가 무엇인가 놓친가요?

답변

0

네, 뭔가 잘못 생각한 것 같습니다. 집계를 올바르게 설계하면, 특히 작게 만들면, 무의미한 거래는 발생하지 않을 것입니다. 적어도 많은 것은 아닙니다. 집계는 매우 응집되어 있어야하므로 동시에 수정되는 속성/상태는 동일한 집계에 있어야합니다. 즉 상태에 대한 동시 액세스를 보호하기 위해 집계 지점입니다.

집계가 그보다 큰 경우 force-field 집계가 너무 넓고 응집력이없는 명령이 아무 것도없이 직렬화 될 수 있다는 큰 변화가 있습니다.

order item을 추가하고 동시에 order shipping details을 변경할 확률이 매우 낮기 때문에 orders에 대해서는 많은 실패한 트랜잭션이 발생하지 않습니다.

어쨌든 트랜잭션 때문에 교착 상태가 발생하지 않지만 실패한 트랜잭션이 발생할 수 있습니다. 저장소가 거의 방법이있을 것입니다 가장 순수한 형태에서

+0

교착 상태 가능성이 게시물을 확인하십시오. https://stackoverflow.com/questions/34662578/in-domain-driven-design-why-would-you-use-an-aggregate-object-and-what-key-pr – Costa

+0

나는 모든 행동이 아니라고 말합니다. 루트 집계에서 트랜잭션에 있어야합니다. 일관성 문제가 발생할 수있는 경우 트랜잭션을 고려해야하며 해당 동작을 분석해야합니다. 예를 들어 배송 세부 정보 만 변경하는 경우 거래가 필요한 이유는 무엇입니까? 주문 항목 만 삭제하는 경우 거래가 필요한 이유는 무엇입니까? 따라서 Order.UpdateOrder 및 Order.DeleteOrderItem 메서드에서 트랜잭션을 고려하지 않아야합니다. – Costa

+0

@Costa 그러나 이러한 경우 트랜잭션이 필요합니다. 그렇지 않으면 저장소 구현에 따라 복잡해질 수 있습니다. 집계는 명령을 처리 할 때/전에 완전히로드되므로 지연로드가 없어야합니다. –

0

가 :

public interface IAggregateRepository 
{ 
    AggregateRoot Get(Guid id); 
    void Save(AggregateRoot instance); 
} 

이 사용 사례 사이에 차이가 없다 /이 시나리오의 명령. 거래가 필요한지 여부를 반드시 알 필요는 없습니다.

또 다른 고려 사항은 통합/응용 프로그램 에서 트랜잭션을 처리해야한다는 것입니다. 이렇게하면 트랜잭션 처리를 도메인 상호 작용에서 더 멀리 이동시킬 수 있습니다.

은 응용 프로그램에 특정 유스 케이스를 인식하고 특정 명령에 대한 트랜잭션을 포기하도록 할 수 있습니다. 그러나 이것이 더 가치있는 일일 수 있습니다.

마지막 포인트는 트랜잭션이 만이하고있는 것에 대해뿐만 아니라 다른이 무엇을하고 있는지 항상되지 않는 것입니다.

내가주의를 기울이고 오히려 트랜잭션을 사용합니다.트랜잭션을 사용하지 않는 특정 이유가있는 경우에는 확실히 옵션이지만 읽기에 더 적합합니다. 당신은 당신이 다른 골재와 다른 경계 상황을 가질 수있다 핵심 DDD 방식을 사용하는 대신 바로 배송 정보를 업데이트 할 수 어딘가에 시스템의 필요성이있는 경우

0

, 그냥 두 개의 필드가 ShippingRequest, OrderIdShippingDetails를 호출하자 결국 같은 기본 테이블에 매핑되거나 매핑되지 않을 수 있습니다. 그런 다음이 집계는 트랜잭션이 암시 적으로 다루는 하나의 테이블로 매핑됩니다.

DDD가 구현할 가치가 없으며 일부 기존 CRUD/트랜잭션 스크립트 방식으로 충분하기 때문에 이러한 모든 경계 된 컨텍스트, 유비쿼터스 언어 및 집계를 신경 쓰지 않을 수도 있습니다.

문제는 DDD가 종종 이와 같은 잘못된 예제에서 시간을 설명하는 것입니다. 집계 (Aggregate)는 비즈니스 규칙을 나타내는 일정한 일관성 경계를 정의합니다. Order as a Aggregate의 경우, order가 최대 허용 가능한 total을 할당한다고 가정합시다. 항목을 추가하거나 삭제할 때마다 전체 집계를 검색하여 하나의 원자 단위로 업데이트해야하기 때문에 자연 집계가됩니다.

+0

OrderItem은 최대 개수가 없더라도 Order없이 모델에 살 수 없으므로 루트를 집계 할 수 없습니다. 주문 집계의 일부 – Costa

+0

확실히 생성자에서 할당해야하는 OrderId 속성이있는 경우 ... –

+0

OO 캡슐화를 위반하기 때문에 OrderItem에 OrderID 특성을 추가 할 수 없습니다. – Costa

관련 문제