2014-02-20 2 views
0

다음 예제 집계를 감안할 때? 예 :DDD 아이 엔티티 캡슐화

foreach(OrderLine line in currentOrder.Lines) 
{ 
    line.Cancel(); 
} 

어쨌든 캡슐화 된 총계 루트가 있어야합니까? 유일한 해결책은 대신 노출되는 일련의 병렬 주문 라인 값 개체를 만드는 것입니까?

어떤 통찰력에도 감사드립니다.

답변

1

Cancel 메서드를 내부에서 시작하여 Order 어셈블리 내부에서만 볼 수는 없습니까? 물론이 어셈블리의 다른 클래스는 여전히 cancel 메서드에 액세스 할 수 있습니다.

또 다른 방법은 OrderLines 컬렉션을 IOrderLine 인터페이스의 컬렉션으로 노출하고 그런 식으로 Cancel 메서드를 숨기는 것입니다.

+0

예, 노출을 줄이기 위해 내부 메소드를 만드는 것을 고려했으며 아마 그렇게 할 것입니다. 또한 인터페이스 라우트로 간주되었지만 누군가가 결과를 OrderLine 오브젝트로 캐스팅하고 cancel 메소드를 직접 호출 할 수 있습니다. 나는 편집증에 접경하고있는 것을 알고있다. 그러나 나는 이것이 진정한 캡슐화를 제공하는 "올바른"방법이 있는지 궁금하다. 그렇지 않으면 여기서 타협을해야만 할까? 내가 더 좋은 대답을 얻지 못하면 당신을 받아 들일 것입니다. 조언 해주셔서 감사합니다. –

0

왜 선을 표시합니까? Order Line 자체가 아닌 외부에 필요한 OrderLines에 대한 정보가 포함 된 일부 스냅 샷 (DTO)을 노출합니다. 그것은 알려진 해결책입니다. 그리고 CQRS를 사용하면 노출시킬 필요가 전혀 없을 수도 있습니다.

+0

내가 읽은 바로는 DTO에는 도메인 자체가 없습니다. 또한 모든 하위 엔티티에 대한 스냅 샷 객체를 만드는 것은 매우 지루한 일입니다. 참고로, 나는이 같은 목록을 반환 발견 : public IEnumerable Lines {get {return _orderLines.AsEnumerable(); }}이 문제를 해결합니다. 반환 된 행을 수정해도 집계에 저장된 행은 영향을받지 않습니다. 대신 복사본이 만들어진 것 같습니다. –