2010-07-02 4 views
2

도메인 기반 디자인과 관련하여 약간의 독서를하고 있으며 집계 루트에서 순회하여 집계 내의 모든 엔티티에 액세스해야합니다.통과 집계

그러나 동시에 속성/필드가 보호되거나 개인이되도록 데이터를 캡슐화해야합니다.

내 질문은 : 필드가 보호 된 경우/개인 어떻게 트래킹을 집계해야합니까?

내가 지금 설정 한 방법은 다음과 같습니다. 내 도메인 모델의 모든 속성을 내부로 설정하고 보호 된 것으로 표시된 "설정"방법을 표시합니다. 이렇게하면 모델 외부의 모든 것이 속성에 액세스 할 수 있지만 모델 내의 객체는 다른 객체 속성에 액세스 할 수 있으며 객체 자체 내에서 속성을 설정할 수만 있습니다.

이 작업을 수행해도 다른 집계 엔티티 (즉, 고객의 "이름"은 여전히 ​​비공개이지만 고객의 "주문"은 내부 -> 주문 -> 등)에서 트래버스 허용 내부

아무도 이것에 대한 지침이 있습니까?

편집 :

날 시도하고 질문에 대한 좀 더 구체적인 예를 들어 보겠습니다 : 을 내 객체 그래프에서 두 개체가 : 책장 및 책. 이 예제에서 Bookshelf는 집계 루트이고 Books는 책꽂이에 저장되므로 집계 내의 엔티티 만 (Bookshelf에는 책 모음이 있음)합시다.

책꽂이에 새 책을 추가하는 방법을 쓰고 싶습니다. DDD 모범 사례에 따라 AddBook (Book book)과 같은 Bookshelf 클래스에 메서드를 작성해야한다고 생각합니다.

그러나 동일한 제목의 책을 ​​책꽂이에 추가 할 수 없다는 비즈니스 요구 사항이있는 경우에는 어떻게해야합니까? Bookshelf.AddBook 메서드 내에서 일부 논리를 사용하여 책 모음을 검사하여이 책이 존재하지 않는지 확인합니다.

이제 문제는 책 객체를 멋지게 캡슐화 된 방식으로 작성하고 "이름"속성에 공개적으로 액세스 할 수 없기 때문에 내가 할 수 없다는 것입니다.

나는 이것이 상당히 고안된 예제라는 것을 알고 있지만, 문제를 더 잘 보여주기를 바랍니다. 또한 이제는 이것이 DDD 문제가 아니라 OO 캡슐화 문제라는 사실을 깨닫게되었습니다. 내가하고 싶은 일을 해결하는 매우 일반적인 방법이 있어야하며 나는 그것을 극도로 지나치게 생각하고있다.

답변

2

부모와 자녀 사이의 관계 성, 유사성 관계의 경우 속성을 노출하는 데는 아무런 문제가 없습니다. 자식 속성은 부모에게 노출되지만 강력한 관계와 상호 의존성 때문에 캡슐화가 중단되지 않습니다.

즉, 책의 이름 속성을 책꽂이에 노출하는 데는 아무런 문제가 없지만 책의 이름을 다른 집계에 노출하는 것은 잘못된 것입니다 (DDD 모범 사례의 의미에서). 수정 가능한 도서 컬렉션을 폭로하는 것은 또한 잘못된 것입니다. 읽기 전용 콜렉션을 노출 할 때는주의해야합니다. 캡슐화가 깨지는 징후 일 수 있습니다.

귀하의 질문에 대한 답변이 있습니까?

+0

그것은 질문에 답해줍니다. 나는 그것이 내가 그것을 과소 평가했다는 것을 의미한다고 생각합니다. 단지 규칙을 약간 완화하고 속성을 사용할 수있게 만드는 것만 큼 쉽지만 집계 내에서만 가능합니다. 문제는 C# 언어 기능을 사용하여 책 이름에 대한 서가에 대한 액세스를 허용하지만 집계 외부에있는 클래스에 대한 액세스를 허용하지 않는 것입니다. (하나의 C# 어셈블리 내에있는 하나의 제한된 컨텍스트에 대한 서로 다른 집계로 생각하면됩니다) – Justin

-1

Visitor pattern은 일반적인 트래버 설 메커니즘입니다.

+0

여기에있는 트래 버설 유형이 아닙니다. 방문자 패턴을 사용하면 객체 그래프를 탐색하고 그래프의 각 노드에서 작업을 수행 할 수 있습니다. 그러나 저는 부모 엔티티의 포함 된 객체를 참조하는 것에 대해 이야기합니다. 예를 들면 다음과 같습니다. var customerOrderLineItems = customer.Orders [0] .OrderLines; – Justin

+0

몇 가지 선택 사항이 있습니다. 우선, 어떤 사람들은 그런 대상에 "도달해서는 안된다"고 생각합니다. 이는 개체 그래프를 자체 포함 된 자체 관리 엔티티가 아닌 벙어리 값 보유자로 취급한다는 의미입니다. 작업이 클래스에 충분히 통합되어 있으면 클래스의 작업이어야하며 필요에 따라 포함 된 개인 객체에 위임해야합니다. 이중 디스패치로 분리 된 시스템이 필요하다면 방문객 패턴이 필요합니다. 다른 방법은 N * M 세트의 관계에있는 여러 객체에 여러 메소드를 연결합니다. 유지 관리 문제입니다. –