2011-11-28 37 views
1

我正在嘗試爲我的公司建模一個計劃應用程序,並且可以使用一些建議。如果合適,我想遵循域驅動設計。使用DDD建模計劃

該域包含一個Show對象,代表一個貿易展覽,展覽或會議,我們可能會推廣我們的產品。它具有開始和結束日期和時間,議程,發言人名單,地點等。可以使用演出完成一些工作,例如分配發言者,註冊參與者,取消等。

我們通常作爲一個或多個營銷活動的一部分參加展會。廣告系列還包含開始日期和結束日期以及其他信息,以及我們將參與該廣告系列的節目列表。我們可能會在特定的展會上宣傳多個廣告系列。

可以在廣告系列中添加或刪除節目,並且在取消節目時,必須從與其關聯的任何廣告系列中刪除節目。

我的第一個想法是將Schedule聚合根與包含Show對象列表的Campaign實體列表進行比較。但是我需要一種訪問獨立節目的方式 - 一個節目可以與多個廣告系列相關聯。看看我的用例,我正在開發一個Silverlight客戶端(但也可能會移動)。主視圖將是一個日曆類型的用戶界面(如Outlook),將每個顯示顯示爲約會。還有側欄顯示即將進行的節目,當前的廣告系列和顯示有後續任務。當我在任何這些視圖中雙擊一個項目時,顯示細節顯示在一個子窗口中。

任何建議如何在我的應用程序代碼中建模該域名?

回答

3

但我需要一種方法來訪問獨立的節目 - 一個節目可以與多個廣告系列相關聯。

,而不是試圖把一切都安排聚合根(長期當你談論域自由是不會出現在你的語言)下,嘗試有2根合計 - 展會和活動。

活動還包含開始和結束日期以及其他信息以及我們將參加該活動的節目列表。

Campaign可能沒有必要持有對Show的引用。如果展會知道其宣傳的廣告系列,那麼當您顯示廣告系列信息時就足以找到它。

可以從廣告系列中添加或刪除節目,並且在取消節目時,必須從與其關聯的任何廣告系列中刪除節目。

No, it should not
應將顯示標記爲已取消,如有必要,廣告系列將隱藏它。

我會從this之類的東西開始。


那只是因爲我試圖簡明扼要該附表沒有出臺,直到我開始討論模型。實際上,時間表是應用程序的全部要點。時間表代表所有節目。

很可能有要求在您的域模型中引入Schedule的要求。但由於我還沒有聽到它(或不明白你的域名足夠好),我只是將我的應用程序命名爲Scheduler。或調度程序有界的上下文,如果應用程序不僅僅是關於日程表和活動。

另外,在顧客的意見中,展會不一定了解宣傳活動。在我們所有的討論中,他們只提到將展覽分配給廣告系列。

如果Show必須存在於「獨立版本」中,它是一個聚合根(在Schedule下推下來不會改變事物,這隻會增加一個抽象層,Show仍然獨立於Campaigns )。如果需要確定Campaign/s Show與「獨立版本」中顯示的內容相關聯,則應該有Show-> Campaigns關聯。儘管它可能會對域名感到有點矛盾,但你可以把它看作是一種犧牲。

我們交易能力表達自己與清晰的原創想法(Uncertainty principle可以在這裏用作一個很好的比喻)。畢竟,我們無法完全徹底地捕捉心理模型。

從邏輯上說,我同意你的觀點,但我也希望確保所有顯示已分配給它的活動只有一個實例共享。

您應該關注域對象的生命週期。

對象的構建和重構之間存在巨大差異。通常情況下,Campaign只能構建一次,之後 - 只能從數據存儲重建。如果確保同一Campaign的不同實例(從域角度來看)不能兩次保存 - 通常就足夠了。

這就是我最初認爲Campaign是根源的原因,但這樣做卻忽視了現實,即將會出現不屬於Campaign的部分。

Y ...你對此正確。

+0

這只是因爲我試圖簡潔,直到我開始討論模型時才引入Schedule。實際上,時間表是應用程序的全部要點。時間表代表所有節目。 – SonOfPirate

+0

此外,在客戶的意見中,展會不一定了解宣傳活動。在我們所有的討論中,他們只提到將展覽分配給廣告系列。從邏輯上講,我同意你的觀點,但我也希望確保只有一個Campaign由所有展示共享的實例分配給它。這就是我最初認爲Campaign是根源的原因,但這樣做卻忽略了現實,即不會出現Campaign的一部分。 – SonOfPirate

+0

不幸的是,由於網絡安全限制,我現在無法訪問您的鏈接,但今天晚上將從家中返回。 – SonOfPirate