2012-12-20 104 views
0

我正在開發搜索機票的客戶端應用程序。我從服務器獲得了一個帶搜索結果的JSON,我應該將這個結果表達給客戶端。DDD:可以包含聚合根內部的實體列表

假設我有一個Fare,AirlineCompanyAviaTicketSearchResult的對象。 AviaTicketSearchResult應該包含AirlineCompany對象的列表。每個AirlineCompany應該包含Fare s。我猜AviaTicketSearchResultAirlineCompany是一個聚合根,因爲我有層疊刪除的規則,當我刪除AirlineCompany時,刪除所有與AviaTicketSearchResult相同的航空公司票價是有意義的。

1)在聚合根(AirlineCompany)內包含Fare s列表可以嗎?

另一個問題是我應該在AirlineCompany內有Fare的篩選功能。每個票價都有一個行程,每個行程都有一個變種列表(ItineraryVariant)(不同的腿,旅行等)。當我接受過濾器時,我應更新我的AirlineCompany並刪除不必要的Fare s或刪除不必要的ItineraryVariant混凝土Fare

2)如何應用過濾能力?

我假設我應該將票價表示爲VO,並且每次應用過濾器時都會從原始數據(json)重新創建票價對象,然後在將所有AviaTicketSearchResult更新爲已過濾的AirlineCompany後將其添加到AirlineCompany。

回答

4

我不認爲Domain-Driven Design在這裏很適合。據我可以告訴你只是談論一些UI的DTO和一些手段來過濾它們。

當您試圖掌握(和建模)複雜行爲時,領域驅動設計就派上用場了。查看模型或DTO應儘可能簡單。大多數時候,不需要複雜和耗時的建模工作。

或者,正如埃裏克·埃文斯所說的那樣:

專注於核心領域

+0

我已經用服務層包裝了我的域模型,UI有對ServiceFacade的引用,它將DTO對象返回給UI。 – tikhop

+0

而這個任務只是複雜應用的一部分。顯示結果後,用戶應選擇具體票價並創建具有選定票價的訂單。 – tikhop

+2

@tikhop當您聲明這是複雜應用程序的一部分,DDD可能應用於應用程序的其他部分,特別是可處理訂單創建的部分。然而,這個特定部分不涉及總量和VO。你有可能對應於聚集的DTO,但它們本身不是聚集的。因此,您可以以最能代表數據的方式構建DTO - 只是基本的OOP。您不必擔心一致性邊界,持久性等問題。 – eulerfx

1

1)它是確定含有一個聚合根 (AirlineCompany)內票價的名單?

是的,特別是如果AirlineCompany真的是您的聚合根,可能是這種情況。從你的問題,我想你可能會從更多地瞭解問題領域中受益。應該AirlineCompany真的是一個聚合根,還是隻是客戶的名字?也許票價應該是真正的聚合根,AirlineCompany應該是票價上的字符串屬性。小心不要過度模型,並專注於問題領域。如果您的客戶是購買機票的人,我懷疑他們是否專注於航空公司,因爲他們是票價和行程。在對問題域進行建模時,應該暫時忘記JSON和VO等內容。

2)如何應用過濾能力?

應該由您的存儲庫或域服務負責根據過濾器參數過濾結果。這個的實施取決於你。但是,通常情況下,如果客戶端正在與服務器進行通信,服務器將運行存儲庫應用程序代碼,根據您的實現,代碼可以將代碼傳遞到數據庫服務器上,以使您獲得儘可能最佳的性能,從而不會通過無關的數據。