문제

도메인 구동 설계에 정통하지 않았으며 최근 프로젝트를위한 도메인 모델을 만들기 시작했습니다. 나는 여전히 ORM을 결정하지 않았지만 (아마도 nhibernate와 함께 갈 것임) 현재 내 가치 객체가 바로 그럴 수 있도록 노력하고 있습니다.

예를 들어 "Like"용어를 캡슐화하는 것 외에는 다른 행동이없는 VO가 있습니다.

public class Referral {
    public Case Case { get; set; } // this is the a reference to the aggregate root
    public ReferralType ReferralType { get; set; } // this is an enum
    public string ReferralTypeOther { get; set; }
} // etc, etc.

이 특정 클래스는 두 레벨이 상승한 "Case"에 대한 참조가 있으므로 추천에 액세스하려고한다면 나는 갈 수 있습니다 : case.social.referral (사례, 소셜 및 추천은 모든 수업입니다. 단일 소셜이 있습니다. 사건 내부에는 소셜 내부에 단일 추천이 있습니다). 내가 입력 할 때 그것을보고 있으므로, 나는 사회적 실체를 통해 접근 할 수 있기 때문에 추천에 사례가 필요하다고 생각하지 않습니까?

이제 내 마음에 이것은 VO가되어야하는 것이 의심의 여지가 없으며, 이것을 데이터베이스에 유지하기 위해 사용하려는 방법은 nhibernate를 대리 식별자에게 할당하도록하는 것입니다 (여전히 너무 명확하지 않습니다. , 누군가가 그것에 대해 자세히 설명 할 수 있다면, 대리 식별자가 이미 내 VO에 ID가 있는지 또는 하나없이 작동 할 수 있는지 여부) 및/또는 보호 된 ID 속성을 요구하는지 모르기 때문에 도움이 될 것입니다. 그것은 추천 클래스 외부에서 노출되지 않습니다 (DB에 지속되는 목적으로만).

이제 내 제목 질문 : VO에 컬렉션이 있어야합니까 (내 경우에는 목록)가 있어야합니까? 나는 이것을 데이터베이스에서 일대일 관계로 생각할 수 있지만 신원이 없기 때문에 클래스를 엔티티로 만드는 데 적합하지 않은 것처럼 보입니다. 아래는 코드입니다.

public class LivingSituation {
    private IList<AdultAtHome> AdultsAtHome { get; set; }
    public ResidingWith CurrentlyResidingWith { get; set } // this is an enum
} // etc, etc.

이 클래스에는 현재 ID가 없으며 성인 수업에는 본질 유형 (문자열, int)이 있습니다. 따라서 이것이 엔티티인지 또는 VO로 유지 될 수 있는지 확실하지 않으며, 자체 테이블과 개인/보호 ID 필드를 사용하여 1 : M 관계를 사용하도록 ORM을 구성하면됩니다. ORM은 DB에 지속될 수 있습니다.

또한 각 클래스에 대해 정규화 된 테이블과 함께 가야합니까? 수업의 여러 인스턴스가 엔티티 또는 값 객체에 할당 될 가능성이 있거나 컬렉션 1 : M 관계가있을 수있는 경우 수업 당 테이블 만 사용하면됩니다. . 고유 유형을 가진 특정 값 객체에 단일 테이블을 사용하는 데 아무런 문제가 없지만 중첩 된 유형의 경우 정규화 된 테이블을 사용하는 것이 유리하다고 생각합니다. 이것에 대한 제안도 있습니까?

여러 질문에 대해 말이 너무 죄송합니다.

1) 내 가치 개체에 대한 대리 식별자 (nhibernate와 함께)가 필요합니까?

2) #1이 예라면, 내 값 객체가 개념의 값 객체로 남아 있도록 개인/보호해야합니까?

3) 값 객체에 다른 값 객체 (예 : 목록)가 있거나 엔티티를 구성 할 수 있습니까? (나는 이것에 대한 대답은 아니오라고 생각하지만, 더 나아가기 전에 확신하는 것을 선호합니다.)

4) 집계 루트에서 몇 레벨이 낮은 값 객체에서 집계 루트에 대한 참조가 필요합니까? (내가 그렇게 생각하지 않습니다. 이것은 모델을 쓸 때 내 입장에 대한 감독 일 것입니다. 누구나 동의합니까?)

5) ORM이 더 간단한 값 객체에 대한 매핑을하도록하는 동안 특정 사물에 정규화 된 테이블 (중첩 유형 및/또는 컬렉션이있는 유형 및/또는 컬렉션이있는 유형)을 사용해도 괜찮습니까? 내 엔티티에 속하는 동일한 테이블에?

다시 한 번 감사드립니다.

도움이 되었습니까?

해결책

관련 질문에 대한 답을 살펴보십시오 여기 그리고 여기


1) 예 - 만약에 당신은 자신의 테이블에 VO를 저장하고 있습니다

2) 개인/보호 된 ID 속성을 사용할 수 있다면 좋습니다. 또는 명시적인 인터페이스를 사용하여 ID 속성을 '숨기기'할 수 있습니다.

그러나 귀하의 질문을 읽으면 ID 속성을 보는 개발자가 객체가 자동으로 엔티티라고 가정 할 것이라고 제안하고 있습니까? 그렇다면 훈련이 필요합니다.

3) 예, 할 수는 있지만 다음과 같은 제한 사항이 있습니다.

  • 매우 드물어야합니다
  • 다른 VO 만 참조해야합니다

또한 이것을 고려하십시오 : Vos 그렇지 않아야합니다 주위에 붙어. 필요할 때마다 전체 VO를 다시 만들기가 쉽고 효율적입니까? 그렇지 않다면 엔티티로 만드십시오.

4) 당신이 당신의 구현 방법에 따라 다릅니다 집계 잠금. 사용하려면 Ayende의 해결책, 대답은 예입니다. 그렇지 않으면 객체 그래프를 집계 루트로 다시 통과하는 메커니즘이 필요합니다.

5) 예. DDD가 있다는 것을 잊지 마십시오 끈기있는 무지 (이상적인 세상에서!).


하지만...

나는 의뢰가되어야한다고 믿는다 실재. 이러한 대화를 상상해보십시오.

대화 1 : :

  • 톰 : "이봐 조! 데이비드 존의 추천을 줄 수 있니?"
  • 조 : "어느 쪽?"
  • 톰 : "죄송합니다. 추천 번호 123을 의미합니다"

Conversation 2:

  • 톰 : "이봐 조! 데이비드 존의 추천을 줄 수 있니?"
  • 조 : "어느 쪽?"
  • 톰 : "상관 없어요 - 그냥 줘"

대화 1은 의뢰가 an이라고 제안합니다 실재, 대화 2는 그것이 VO라고 제안합니다.

한 가지 더 : 그렇습니다 Referral.ReferralType 일생 동안 변화 (엔티티가되어야한다는 또 다른 힌트가 있습니다)? 그 경우 그렇지 않습니다 변화, 다발성 사용을 고려하고 NH가 처리하도록하십시오.

도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top