我正在構建通知系統,其中有用戶可以創建訂閱,以定義通知何時傳遞給他們以及通過哪個端點。我已經確定用戶是一個聚合根,並且會爲他們建立一個存儲庫。不過,我在圍繞這個概念時遇到了一些麻煩。根據我的理解,只有Aggregate Roots應該從存儲庫中提取。域驅動設計中的存儲庫和聚合根
比方說,我有一個用戶
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實體的引用?
我的域中的端點是PhoneNumbers,EmailAddresses等等。我在用戶中有Endpoints,因爲用戶有PhoneNumbers和EmailAddresses。我在訂閱中有端點,因爲用戶將訂閱將通知發送到他的PhoneNumber或EmailAddress。是的,當我刪除用戶時,所有用戶終端和訂閱也會被刪除。沒有創建它們的用戶,它們就不能存在。 我希望檢索一個擁有所有端點和訂閱的用戶,並且我希望檢索與事件匹配的一組訂閱。 – SomeSayIAmAnAsshole