按照DDD概念设计存储库

时间:2017-12-07 01:17:27

标签: c# .net .net-core domain-driven-design

我正面临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>());
    }
}

我认为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和权利)并在客户端存储库中使用权利repo来检索权利?

我要为EntitlementRecords创建另一个回购吗?否则,我最终会拥有一个看起来像这样的权利回购

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

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

最后,在DDD世界中,我是否需要在存储库之间引入依赖关系来检索/保留我的聚合?

1 个答案:

答案 0 :(得分:2)

每个聚合的一个存储库是简单而好的解决方案,因此为Entitlements创建一个repo,为EntitlementRecords创建另一个repo更好。

顺便说一句,您的TecTacClient聚合看起来设计得不好。通常它不应包含Entitlement聚合。或者权利不应被视为单独的聚合,它应该是TecTacClient聚合的一部分。 EntitlementRecord也是如此:它应被视为Entitlement聚合的一部分,或者Entitlement不应包含它。 详细了解&#34; Design Small Aggregates&#34;规则。