2017-09-14 1 views
1

DDD를 사용하여 헬프 데스크 응용 프로그램을 작성 중입니다. 내 질문은 두 가지 가능한 AR을 참조 할 수있는 엔터티를 처리하는 가장 좋은 방법입니다.DDD : 가능한 여러 개의 집계 루트 링크를 처리하는 방법

나는 업데이트 요청을 신청 한 사람인 RequestSubscriber입니다.

이 가입자는 Agent 또는 Contact입니다.

질문은 대리인이나 연락처에 대한 선택적 참조가 있어야하며 관련 유형이있는 일반 사람 참조가 있어야 링크가 올바른 위치에 있는지 확인할 수 있습니까?

모델 옵션 :

// This 
public class RequestSubscriber : DomainEntity, IPerson 
{ 
    // Constuctors... 

    public Guid? Agent_Id { get; private set; } 
    public Guid? Contact_Id { get; private set; } 
    public SubscriberType Type { get; private set; } 
    public Email Email { get; private set; } 
    public PersonName Name { get; private set; } 
} 

// Or This 
public class RequestSubscriber : DomainEntity, IPerson 
{ 
    // Constuctors... 

    public Guid Person_Id { get; private set; } 
    public SubscriberType Type { get; private set; } 
    public Email Email { get; private set; } 
    public PersonName Name { get; private set; } 
} 

Contructors :

// This 
    public RequestSubscriber(Guid id, Request request, IPerson person) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(person, nameof(person)); 

     if(person is Agent agent) 
     { 
      Email = agent.Email; 
      Name = agent.Name; 
      Type = SubscriberType.Agent; 
     } 
     else if (person is Contact contact) 
     { 
      Email = contact.Email; 
      Name = contact.Name; 
      Type = SubscriberType.Contact; 
     } 
     else 
     { 
      throw new ArgumentException("Subscribers must be an agent or contact", nameof(person)); 
     } 

     request.Subscribe(this); 
    } 

    // Or This 
    public RequestSubscriber(Guid id, Request request, Agent agent) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(agent, nameof(agent)); 

     Email = agent.Email; 
     Name = agent.Name; 
     Type = SubscriberType.Agent; 

     request.Subscribe(this); 
    } 

    public RequestSubscriber(Guid id, Request request, Contact contact) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(contact, nameof(contact)); 

     Email = contact.Email; 
     Name = contact.Name; 
     Type = SubscriberType.Contact; 

     request.Subscribe(this); 
    } 
+0

또 다른 생각은 아마도 두 개의 다른 가입자, 즉 에이전트 가입자와 연락 담당자가 있어야한다는 것입니다. –

+0

언급 한 '구독자'클래스가 누락되었습니다. 왜'RequestSubscriber'에'IPerson '이 어떤가가 중요할까요? 해당 AR에 의해 보호되는 불변/일관성 경계는 무엇입니까? –

+0

죄송합니다. 'RequestSubscriber'는 구독자 클래스 이름입니다. 이는 '연락처'에 대한 전자 메일 알림이 '에이전트'와 다르기 때문에 주로 중요합니다. –

답변

0

의 옵션은

당신의 RequestSubscriber가 함께 RequestSubscriber을 가져올 것으로 보인다 간접 :)의 또 다른 레벨을 추가 할 수 있습니다 . Request을 전달하고 있지만 Subscriber 부분에는 개념이 누락되었을 수 있습니다.

마찬가지로 Request은 귀하의 구독자가 나타내는 모든 것을 추상화 할 수있는 귀하의 Subscriber 요청이 무엇이든 추상합니다.

SubscriberType이 필요한 또 다른 이유가있는 경우 구현이 변경 될 수 있습니다.

+0

나는 그것과 IMO에 대해서'RequestSubscriber'에서'Subscriber'에이 문제를 그냥 넘겨 줄 것이라고 생각했습니다. –

+0

아, 나는 당신의 코멘트를 다시 읽었으며 당신은 이것을 언급했다. 실제 문제가 무엇인지에 따라 달라질 것입니다. –