2017-09-06 46 views
1

假設我們有Foo作爲一個AggregateRoot。並且有一些通用的Foo s以及EnhancedFoo s帶有許多擴展屬性。是否可以在單個聚合根類上公開「操作」以獲得通用屬性和增強屬性,並通過驗證檢查來引發異常,如果在非增強對象上調用增強動作Foo對象?從技術上講,在這種情況下,AggregateRoot將爲所有支持的Foo類型聚合所有可能的「操作」?AggregateRoots如何聚合不同的對象類型?

顯然很大程度上取決於領域結構,但我認爲這種假設的情況是相當普遍的。可能是基本的問題,但我只是開始與聚合/根。每一次反饋

更新

比方說,我們有作爲AggregateRoot。而且有通用 S以及FlyableFoo S,SwimmableFoo S,等等。所以,總要「知道」所有可能的行爲(飛,嘎嘎,游泳),並適當地將其暴露在服務功能。如果有什麼被稱爲某些不被當前對象「支持」的原因,Aggregate可能會拋出一個異常「對不起,企鵝不能飛」。

回答

2

我不認爲這是一個好主意。您應該儘量在使用DDD方法的同時保持乾淨的代碼。因此,我建議您在編碼聚合時遵守SOLID原則並嘗試favor composition over inheritance

另外,在設計Aggregates時,您不應該考慮properties,而應該考慮狀態和行爲。這在CQRS中更重要,因爲您不查詢聚集,您沒有任何獲取(根據DDD,您沒有任何setter以及您應該根據無處不在的語言爲您的方法命名)。

您可以使用繼承,但您必須確保獲得(代碼重用)比您鬆動(增加認知努力)更大。我不推薦它。

如果有某些被當前對象「支持」的原因,Aggregate可能會拋出異常「對不起,企鵝不能飛」。

這會破壞Liskov substitution principle

+0

從我的問題不清楚,但我實際上使用組合。反過來說,「屬性」我應該說「行爲」。我添加了更新到我的問題,請檢查。另外,感謝您提及「構成超越繼承」圖,這非常有幫助! – Tenek

+0

@Tenek看到我更新的答案 –