2016-01-20 66 views
5

我覺得很難決定某些東西是否應該成爲域或應用程序的一部分。DDD:什麼進入域和進入應用程序?

通過這個answer閱讀有助於許多概念,如授權,但我仍然發現自己與其他事情掙扎。

爲了說明我的困惑,請考慮發表評論的案例。以下是在發佈評論前需要做的事情。我在括號中表明我認爲這個功能應該去。

  • 確保用戶角色/狀態允許在這篇文章發表評論(授權,去申請)
  • 確認後存在並出版(域),這是我們所評論
  • 確保用戶在最後一分鐘沒有發佈超過5條評論(節流,直覺說它去應用程序)
  • 確保評論不是一個空字符串(域)
  • 確保評論沒有髒話(域?)
  • 確保評論沒有來自同一用戶重複在這個崗位(域?)
  • 格式的註釋(應用)
  • 取下評論說,不允許對當前用戶(應用程序)
  • 檢查某些HTML標籤垃圾評論(應用程序?)

我無法確定檢查垃圾郵件的評論是否是域關注或應用程序,同樣適用於限制。從我的角度來看,這些擔憂都對我很重要,必須在場。但同樣適用於授權,我們知道它不應該在域中。

如果我在域服務和應用程序服務之間分解這些問題,那麼我覺得我的域沒有完全實施,實際上依靠應用程序進行事先檢查。在那種情況下,整個問題是什麼,爲什麼我不能在應用程序中盡全力來減少混淆?

我的當前設置做到這一點:

Controller -> App.CommentingService.Comment() -> Domain.CommentingService.Comment()

這將是有益的,如果有人可以辦理所有必要的步驟來創建註釋,並將其分配到正確層給予一定的推理背後。

回答

3

您的設置看起來不錯。應用程序服務通常有兩種:

應用程序功能:電子郵件通知,授權,持久性等所有功能,除了域,您的系統已經到了這裏。

應用程序協調:爲了滿足用例,您需要協調應用程序功能和域。所有的管道來到這裏。

請記住,應用程序協調模型使用案例,因此不總是匹配1個應用程序服務= 1個域服務,因爲使用案例可能涉及多個進程。

Controller 
    App.CommentingService.Comment() //coordination of below features and domain 
     App.AuthService().Autorize(); //feature 
     Domain.CommentingService.Comment(); //domain 
     App.PersistenceService().Persist(); //feature 
     App.NotificationService().SentNotificationToUser(); //feature 

爲什麼不讓我做這一切的應用,以減少混亂呢?

Resposibility segregation,loose coupling,dependency inyection等;所有這些都是有好處的,原因很多。我將給你一個我最近介入的真實例子:使用Domain服務組裝一個鬆散的組合(它是在.NET框架中),允許我在Web應用程序,一個DesktopApp和一個SOAP Web服務中託管相同的域更改應用程序協調服務,因爲每個應用程序的需求和用例都不相同。

關於什麼進入域和什麼沒有。很難給你一個直接的答案,因爲它取決於你的域名是不是很多。

請在最後一分鐘

你要問你爲什麼節流確保用戶尚未公佈超過5個評論?爲了防止一個凌亂的用戶界面?性能原因?防止拒絕服務威脅?或者在你的「遊戲」中違反規則,因爲你的「遊戲」只是在垃圾郵件中給用戶一次有限的嘗試?這是什麼表示何時是域或應用程序。

+0

節流是爲了確保垃圾郵件發送者可以被控制。此外,正在檢查評論是否包含域名關注的垃圾郵件鏈接?無論它是在Web應用程序,SOAP Web服務還是桌面應用程序中,我都希望這會發生。同樣適用於節流。 –

+0

我認爲你的回答非常好。這讓我想到了我會問自己的每個要求:「如果這個規則不被執行,域會被打破嗎?」。所以對於他們大多數人來說,答案是否定的。如果限制,重複評論,髒字,格式,html標籤甚至授權未被強制執行,則域仍然是完整的。我們的應用程序安全性,性能,友善性,展示可能會失敗,但該域名仍然是正確的。評論仍然會加載並且工作得很好,儘管用粗言穢語和難看的格式。 –

+0

但是,如果我們不強制該評論必須屬於真正的帖子,或者該評論不能爲空,那麼這很可能會破壞該域名。但是,如果我們允許發佈到未發佈的帖子或評論已關閉的帖子,域名是否會被破解尚不清楚。從技術上講,一切都會正常工作,領域將會完好無損,但商業規則將被打破。你對此有何看法? –