我正面临DDD设计问题。我对如何使用聚合来扩展/使用存储库感到困惑。
我目前有两个聚合TecTacClient
和Entitlement
。
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世界中,我是否需要在存储库之间引入依赖关系来检索/保留我的聚合?
答案 0 :(得分:2)
每个聚合的一个存储库是简单而好的解决方案,因此为Entitlements创建一个repo,为EntitlementRecords创建另一个repo更好。
顺便说一句,您的TecTacClient聚合看起来设计得不好。通常它不应包含Entitlement聚合。或者权利不应被视为单独的聚合,它应该是TecTacClient聚合的一部分。 EntitlementRecord也是如此:它应被视为Entitlement聚合的一部分,或者Entitlement不应包含它。 详细了解&#34; Design Small Aggregates&#34;规则。