2017-12-07 3 views
3

DDD 디자인 문제가 있습니다. 집계를 사용하여 저장소를 사용/사용하는 방법에 대해 혼란스러워합니다.DDD 개념을 따르는 리포지토리 디자인

현재 두 개의 집계가 TecTacClientEntitlement입니다.

public class TecTacClient 
{ 
    (...) 
    public ICollection<Entitlement> Entitlements { get; } 
    public bool HasActiveEntitlements => Entitlements.Any(x => x.EndDate >= DateTime.Now); 

    public TecTacClient((...),IEnumerable<Entitlement> entitlements) 
    { 
     (...) 
     Entitlements = new List<Entitlement>(entitlements ?? Enumerable.Empty<Entitlement>()); 
    } 
} 

다른 자격 체계로 간주됩니다. 또한 자격 레코드 모음을 보유합니다. 인 타이틀먼트 레코드는 인 타이틀먼트와 별도로 생성/업데이트됩니다. 예를 들어 예약을 생성 할 때도 자격 레코드가 생성됩니다. 이 작업은 권한 부여에 영향을 미치지 않습니다.

public abstract class Entitlement : Entity 
{ 
    (...) 

    public ICollection<EntitlementRecord> Records { get; } 

    protected Entitlement((...), IEnumerable<EntitlementRecord> records) 
    { 
     (...) 
     Records = new List<EntitlementRecord>(records ?? Enumerable.Empty<EntitlementRecord>()); 
    } 

    public abstract bool IsEligible(Resource resource); 
    public DateTimeRange GetCoveringPeriod(DateTime date) { ... } 
    public double GetAvailableQuantity(DateTime date) { ... } 
    public void Consume(DateTime date, double quantity) { ... } 
    public void Match(DateTime date, double quantity) { ... } 
    public void Cancel(int bookingId) { ... } 
} 

본인은 리포지토리를 사용하여 집계를 검색/보존해야한다는 것을 알고 있습니다.

두 개의 리포지토리 (tectacclient 및 entitlement)를 만들고 클라이언트 리포에서 검색 한 인 타이틀먼트에 권한 부여 레포를 사용해야한다는 의미입니까?

EntitlementRecords에 대해 다른 저장소를 만들까요? 그렇지 않으면 나는 최종까지 내 집계를 지속/검색 내가 저장소 사이의 종속성을 도입 할 필요가 않는 DDD의 세계에서, 결국이

IEntitlementRepo 
{ 
    void Create(...); 
    void Update(...); 
    void Delete(...); 

    void AddRecord(...); 
    void DeleteRecord(...); 
} 

처럼 보이는 자격 REPO을 가지고?

답변

2

집계 당 하나의 저장소가 간단하고 좋은 솔루션이므로 Entitlement에 대해 하나의 Repo와 EntitlementRecords에 대해 하나의 Repo를 갖는 것이 좋습니다.

그런데 TecTacClient 집합체는 잘 디자인되어 있지 않습니다. 일반적으로 Entitlement 집계를 포함해서는 안됩니다. 또는 Entitlement는 별도의 집계로 간주되어서는 안되며 TecTacClient 집계의 일부 여야합니다. EntitlementRecord도 EntitlementRecord와 동일합니다. EntitlementRecord는 Entitlement 집계의 일부로 간주되거나 Entitlement에 포함되어서는 안됩니다. "Design Small Aggregates"규칙에 대해 자세히 알아보십시오.

+0

DDD 접근법의 목표 중 하나는 집합체 내에서 엔티티를 그룹화하여 모델을보다 풍부하고 단순하게 만드는 것이라고 생각했습니다. 하지만 이제이 기사를 읽은 후에는 지속되어야하는 엔티티가 자체 집계와 연결되어야한다고 생각합니다. 내 상황에서는 클라이언트, 자격 부여 및 레코드 간의 관계를 제거함으로써 나는 빈혈 디자인 (1 엔터티, 1 집계, 많은 논리가 아닌)으로 이동한다는 느낌을 갖습니다. – Seb

+0

"나쁜 디자인과 같은"빈민증 :) 디자인 선택은 도메인에 대한 지식을 기반으로해야하므로 이러한 선택을 할 수는 없습니다 ... 샘플 프로젝트를 살펴 보겠습니다. 일반적으로 Client는 하나의 집계이며 OrderItems와의 Order는 다른 것입니다. 그것은 귀하의 도메인으로 번역 될 수 있습니다 : TecTacClient는 하나의 집합체이며, 그 레코드를 가진 인 타이틀먼트는 또 다른 집합체입니다. logi : 내 생각에 집계에는 많은 논리가 포함되어서는 안되며 집계 자체의 일관성에 대한 논리 만 포함하면 안됩니다. –

+0

매우 흥미 롭습니다. 집계되지 않은 비즈니스 로직은 어디에 저장합니까? – Seb

관련 문제