2015-05-16 122 views
0

在使用事件採購的應用程序中,是否可以接受彙總範圍內的事件?整體事件是否可以接受?

考慮一個博客應用程序的設計示例,該應用程序提供了創建帖子和添加和刪除簡單標籤(帖子將是聚合根)的功能。

這可能導致以下事件:

PostCreated: postId, "title", "content" 
TagAdded: postId, "Foo" 
TagAdded: postId, "Bar" 
TagAdded: postId, "Baz" 
TagRemoved: postId, "Bar" 

重放上述事件流會導致一個標題,內容和兩個標籤(「富」 &「巴茲」)後。

現在設想用戶界面只允許您在創建帖子時選擇現有標籤並且不接受自由文本;只有特權用戶纔有能力更新標籤主列表。

現在,當特權用戶創建新標籤時,需要創建相應的事件,以便a)信息實際上存儲在事件存儲中,以及b)在某個時刻更新讀取模型,以便用戶創建博客帖子可以在UI中選擇新標籤。

看起來像TagCreated: postId, "NewTag"的事件對我來說不正確,因爲這些信息並不直接適用於單個帖子。

考慮,在這種情況下,信息不保證它自己的聚合根,只會在這有限的上下文中使用我所期望的線沿線的一個事件:

TagCreated("NewTag") 

這些事件將被存儲在事件存儲使用與特定帖子的上一組事件相同的聚集ID,但沒有特定聚合實例的ID。

到目前爲止,這聽起來像是一種合乎邏輯的方式來處理這個問題,但想知道如果我以這種方式接近它,是否會漏掉任何明顯的東西。

回答

0

恕我直言,你讓複雜化你的生活不必要。域事件通常是可用的交叉有界上下文,它們應該通過引用其ID來與聚合根(AR)相關聯。

在你的例子中,我認爲標籤是一個值對象,所以它會需要一個帖子ID。但是,如果您希望標籤自身可用,那麼它將是一個AR,因此,該事件將具有TagId屬性。

順便說一句,域事件是一個DTO,意味着隨處可用,它們不是需要封裝在一個聚合中的域詳細信息。

0

我想你錯過了「標籤目錄」或類似的概念。它可以有一個單一的聚合體(或者你可能會有不同的用戶羣或類似的目錄),以目錄作爲根目錄,包含所有的標籤作爲值對象。

相關問題