2013-05-02 77 views
1

我想用DDD模擬場景,我們有團隊,開發人員和團隊應該完成的任務。如何訪問另一個聚合中的實體?

基本上,我假定:

  • Team是一個實體(如它可以改變,例如,通過讓上板新開發者)
  • Developer是一個實體,以及(因爲它是重要的,其開發商做了什麼)
  • Story是一個實體(因爲它可以改變,例如,通過預約的工作項目上的故事)
  • Work是一個值對象(因爲它不能改變,一旦它已經完成)

什麼是相當明顯的是,Team是一個聚合,包含Developer實體。另外,Story是一個聚合,包含Work值對象。

所以,在開始的時候,我開始用下面的代碼:

var team = Team.FoundTeam(); 
team.WelcomeDeveloper("John Doe"); 
team.WelcomeDeveloper("Jane Doe"); 

var story = Story.WriteDownStory("Publish website"); 
story.AssignTeam(team); 

到目前爲止,一切都很好。現在,下一步,我想收取故事的工作。基本上這可能如此簡單:

story.ChargeWork(new TimeSpan(2, 0, 0)); 

不幸的是,現在需要將工作分配給開發人員。這是我的問題:我如何建模?我不能做的是:

story.ChargeWork("Jane Doe", new TimeSpan(2, 0, 0)); 

如果有兩個同名的開發人員,這會失敗。我如何分配特定的開發人員實體而無需訪問它(因爲只能使用Team聚合根訪問開發人員)?

對此有何暗示?

我的模型是完全破碎的,還是我錯過了一些重要的東西?

+2

我看到您已將問題標記爲「數據建模」。這是你的想法告訴你的一個暗示:你正在建模數據(狀態),而不是建模業務流程即DDD。 – MikeSW 2013-05-02 08:53:56

+0

感謝您的提示!這比第一眼看起來更有價值,因此+1 :-) – 2013-05-02 09:38:32

回答

2

您可以使用ID作爲參考。

var jane = developer.findByName('Jane Doe'); 
story.ChargeWork(jane.id, new TimeSpan(2,0,0)); 
+0

但是,我會將'Team'聚合體中的實體暴露給外部,不是嗎? – 2013-05-02 08:43:53

+2

沒有域驅動的設計禁止一個對象持有另一個聚合內的實體_object reference_。這並不意味着你不能存儲對象的_identity_的引用,這就是這個答案的作用。 – 2013-05-02 18:56:59

2

除了領域專家可以告訴你模型是否壞了,但我可以告訴你一些IMO彈出的東西。

團隊是聚合在一起的開發人員的根(不是聚合)。但是,開發人員在團隊中的定義有界上下文可能僅僅是一個Id和一些相關行爲,也就是說它不是一個相同的開發者實體,它是在其自身有界的上下文中(在團隊之外)的聚合根。

現在,Team實體非常簡單地執行獨特的開發人員。另外,我認爲團隊應該向開發者收費(仍然困惑什麼是收費意味着)而不是故事。當你開始執行技術規則(X是實體,Y是值對象,我必須有一個存儲庫等)時,模型應該緊跟現實生活過程,你走錯了路。

+0

+1我認爲你已經在不同背景下突出了開發人員的頭腦。開發人員很可能在許多團隊中工作 - 在這種情況下,關係會逆轉,其中Developer是聚合根,並且包含一個或多個團隊。 OP已經暗示了有限的背景 - 在故事/工作環境中,開發人員只是一個姓名字符串。我想補充一點,引入一些跨上下文一致的自然或代理鍵通常是一個好主意,並且可能在跨越上下文時作爲參考鍵 - 正如mattwagl所暗示的那樣。 – MattDavey 2013-05-02 12:15:03

相關問題