2013-08-07 2 views
2

DDD를 이해하는 데 어려움을 겪고 있습니다. 다음은 나를 괴롭히는 시나리오입니다. 가치 객체 할당/보유 및 역사적 가격을 가진 실체 기금을 보유하고 있다고 가정 해보십시오. 서비스가 특정 펀드의 배분만을 원하는 경우에는 어떻게해야합니까? 할당 객체의 목록을 반환하거나 할당 목록이 들어있는 Fund 엔터티를 반환해야합니까? 첫 번째 접근 방식을 사용한다면 할당 저장소를 만들어야합니다. 두 번째 접근법은 엔티티가 특정 값 객체 만 서비스로 반환하도록 수정되므로 약간 이상하게 보입니다. 기업에 대한 많은 지식이 없으면 서비스에 액세스 할 수있는 모든 자금 필드가 없어야합니까?DDD 프랙티스 : 값 오브젝트에 대한 저장소를 생성해야합니까?

설명이 정확하지 않을 수 있습니다. 내 게시물을 명확하게해야하는지 알려주세요.

class Fund 
{ 
    int fundId; 
    List<Allocation> allocations; 
    List<Holding> holdings; 
} 
class Allocation 
{ 
    string type; 
    string percentage; 
} 
+0

엔티티 수업을 게시 할 수 있습니까? (또는 가상의 시나리오 인 것처럼 보이기 때문에 모의 해보십시오.) – Pluc

+0

Thanks @Pluc. 그냥 모의 수업을 추가했습니다. – zsljulius

답변

3

리포지토리 구현에는 여러 가지 변형이 있지만 할당 IF 목록을 반환하는 데는 신경 쓰지 않습니다. 할당 만 자체적으로 관리되지는 않습니다.

즉, 어떤 펀드가 속해 있는지 상관없이 할당에 대한 정보를 얻고 자한다면 어떤 경우에 할당을위한 저장소가 필요하며 그러한 저장소를 만드는 경우, 그런 다음 getAllocationsbyFundId(int id) 또는 유사한 형태의 메소드가 있어야합니다. 그것이 어떤 펀드인지 알지 못하고 할당을 스스로 조사하는 것이 의미가 없다면, 할당은 실제로 펀드의 일부이며, 펀드 저장소에 대한 방법을 가지고있는 것이 합리적입니다. 특정 기금.

그러나 기금 저장소에 GetAllAllocation() 방법으로 끝나면 깨끗한 패턴을 벗어났습니다.

5

제목에있는 질문에 대답하려면 아니해야합니다. 저장소 패턴은 저장소의 항목에 ID가있는 경우에만 작동합니다. 객체가 ID를 가지면 값 객체가 아닌 엔티티입니다.

값 개체는 모두 또는 무효 여야합니다 (예 : 값 객체에서 한 속성을 변경하면 전체 속성이 바뀝니다. 따라서 값 객체는 생성 후에 불변이다.

리포지토리 내부의 값 개체 버전이 ID를 가질 수는 없지만 지속성 문제로 인해 도메인이 변경되지 않도록해야합니다.

설명에 따르면 실제로는 Allocation이 엔티티 인 것처럼 보이는데, 이는 차별화가 가능하며 ID가 있기 때문입니다.

Allocation이 엔티티라고 가정하면, 내가 묻는 질문은 Allocation이 자체 집계가되어야한다는 것입니다.

+0

* "내가 묻는 질문은 할당이 자체 집계이어야합니다."*. 이 질문은 ** 문맥에 맞아야합니다 **. 하나의 주어진 제한된 컨텍스트에서 다른 개체는 값 개체 일 수 있지만 집계 개체 일 수 있습니다. – MattDavey

+0

@MattDavey 나는 문맥 전반에 걸쳐 이런 종류의 질문을하는 것이 합리적이지 않을 것이라고 우리가 한 맥락에서 운영한다고 가정하고있다. – Mgetz

+1

예, 이것이 제가 말한 것입니다. 질문은 문맥에서만 적용 가능합니다. 위험은 * "배분이 자체 총계"*가되어야하며, 모든 맥락에서 무차별 적으로 대답을 적용하는 것이어야합니다. – MattDavey

1

도메인을 잘 이해하지 못해서 잘못 알고있는 경우 알려주세요. Order/OrderLine 시나리오를 취할 때 OrderLine을 VO로 모델링 할 수 있습니다 (Fund/Allocation과 매우 유사). 왜 Order에 대한 OrderLine 개체 목록 만 반환하도록 서비스를 쿼리해야합니까? :)

그러나 정말 당신이 Fund 인스턴스를로드하고 포함 Allocations 목록을 사용한다이 작업을 수행해야합니다. 그러나 도메인 모델을 쿼리하면 일반적으로 문제가 발생합니다 (느린로드, 가져 오기 전략 및 tell-don't-ask에서 벗어남). 쿼리해야하는 경우이 함수를 수행하는 간단한 쿼리 모델 (일부는 읽기 모델이라고 함)을 만드는 것이 좋습니다.

그래서 Mgetz와 협의하여 VO 저장소를 만들어야합니다. 고정 된 VO 목록이 있다면 enum 구조 유형을 사용할 수 있습니다. C#에서는 readonly 클래스 인스턴스를 사용하여이 작업을 수행 할 수 있습니다. Vaughn Vernon은 이것을 '표준 유형'이라고 부릅니다 (메모리가 작동하는 경우). 나는 시나리오라고 생각하지 않습니다.

관련 문제