2016-11-06 106 views
3

假設我有一個包含2個聚合根的「目錄」有界上下文。公司和個人。公司擁有一系列子實體「職位」,用於存儲具有某些額外價值數據的人員聚合ID。DDD在有界的上下文中引用子實體

一切都好。

現在我們去添加一個帶有聚合根JobAriticle的「Article」有界上下文。這需要一個從公司位置映射的Contact值對象。

因此,知道你應該只引用聚合根,我該怎麼辦?假設公司中存在不變因素以保持倉位關係,所以我不想拆分彙總。通過反腐敗層與公司和職位ID一起映射職位是否可行?或者我需要嘗試和分解公司總量。

回答

5

如果Position在「Article」有界的上下文的普遍語言中是一個有意義的概念,那麼Position應該是「Article」有界上下文中的ValueObject或Entity。

如果您說Contact是「Article」有界的上下文中的有意義的概念,但它需要以某種方式與「Directory」有界上下文中的Position關聯,那麼您需要考慮什麼是相關性的目的:

  • 您是否需要在JobArticle上創建聯繫人之前驗證某個職位是否存在?
  • 是否有一些共享數據將在PositionContact之間保持同步?
  • 如果職位被歸檔/刪除或以其他方式退出服務,會發生什麼情況 - 您是否必須對所有聯繫人進行操作?

如果您需要驗證一個Position建立相關聯繫之前存在,那麼隱含的位置起在文章上下文的職責作用 - 所以我會很想創建在文章上下文中的新Position實體並保持同步。

無論哪種方式,在文章的上下文的東西用在目錄範圍內對應的實體關聯,你可以在一個名爲PositionCorrelation的「條」背景下,它將有兩個特性創建的ValueObject:

  1. CompanyId(全球唯一)
  2. PositionId(公司內的本地唯一的)

一個聚合只應參考其他聚合根的規則並不意味着你不能也提供用於識別聚合內的實體的信息。這意味着如果你想與其他實體進行交互,你應該通過這個聚合根,這意味着你必須至少有具有聚合根Id。如果你然後使用本地身份證來要求公司對某個職位做某事,那很好。

但是請注意,按照這種方法,您將「位置」一詞引入到「文章」有界的上下文中,如果「位置」一詞在「文章」中有其他含義,則可能引入名稱衝突「背景 - 例如也許它意味着文章中的位置(段落號碼等)。如果是這種情況,則需要仔細考慮如何調用交叉上下文標識符。

一種方法可能是,如果Position具有一對一的映射與Contact,那麼你可以有你的兩個屬性是:

  1. CompanyId
  2. CompanyContactId

而保持在噹噹在上下文之間進行整合時,在反腐敗層(ACL)進行同步,將CompanyContactId和PositionId(公司內部的本地值)定義爲同步的。這使每個UL在內部保持一致,並在ACL中定義兩者之間的相關性。

+0

感謝您的詳細回覆。這很有道理。 – Magpie