【发布时间】:2017-09-07 18:58:30
【问题描述】:
我正在构建一个通知系统,其中我的用户可以创建订阅,这些订阅定义何时将通知发送给他们以及通过哪个端点发送。我已经确定一个用户是一个聚合根,并且将为他们提供一个存储库。不过,我在理解这个概念时遇到了一些麻烦。据我了解,只能从存储库中提取聚合根。
假设我有一个用户
public class User
{
public ICollection<Subscription> Subscriptions {get; set;}
public ICollection<Endpoint> Endpoints {get; set;}
}
此用户拥有订阅和端点的集合。这两者都是实体本身,因为它们的内容可以改变而不是不同的对象。例如,这两个实体都可以启用/禁用。它们不能存在于用户上下文之外,因为只有用户才能创建订阅或端点。
我的订阅还包含对端点的引用,因为此订阅需要知道在哪里交付。
public class Subscription
{
public ICollection<Endpoint> Endpoints {get; set;}
}
所以,由于我已将用户定义为聚合根,我现在有一个 UserRepository 用于持久化我的用户。对端点或订阅的任何修改都将在用户作为聚合根的上下文中完成。这对我来说很有意义。但是,如果我想检索符合一组标准的订阅列表怎么办。处理触发通知的系统将收到一个事件,并且需要查询一组与该事件相关的订阅。该事件不是基于用户的,因为多个用户可以拥有对此事件有效的订阅。我会在我的 UserRepository 上放置一个返回这些订阅的方法吗?还是我会创建一个 SubscriptionRepository?如果我创建 SubscriptionRepository,那不意味着 Subscription 也是一个聚合根吗?如果该问题的答案是肯定的,那么我的设计是否违反了 AggregateRoot 的概念,因为 User 和 Subscription 都包含对 Endpoint 实体的引用?
【问题讨论】: