儘管現在已經研究了Domain Driven Design
很長時間,但仍然有一些基本知識我只是想到了。將現實世界的邏輯放入DDD域層時遇到困難
似乎每一次我嘗試設計了豐富的domain layer
的時候,我還需要很多的Domain Services
或厚Application Layer
,我結束了在他們沒有真正的邏輯一堆近貧血域的實體,除了從「GetTotalAmount」等等。關鍵問題是實體不知道外部的東西,並且向實體注入任何東西是不好的做法。
讓我舉一些例子:
1.用戶註冊的服務。用戶被保存在數據庫中,生成並保存文件(用戶帳戶需要),併發送確認電子郵件。
確認電子郵件的例子已在其他主題中進行了大量討論,但沒有真正的結論。一些人建議將邏輯放在application service
中,EmailService
和FileService
從infrastructure layer
中注入。但是,我會在域之外擁有業務邏輯,對吧?其他建議建立一個domain service
是可以獲得infrastructure services
注入 - 但在這種情況下,我需要有domain layer
(IEmailService
和IFileService
)內infrastructure services
的界面看起來並不太好或者(因爲domain layer
不能引用infrastructure layer
) 。另一些人建議實施Udi Dahan's Domain Events,然後讓EmailService和FileService訂閱這些事件。但是這似乎是一個非常鬆散的實現 - 如果服務失敗會發生什麼?請讓我知道你認爲這是正確的解決方案。
2.一首歌是從數字音樂商店購買的。購物車被清空。購買依然存在。支付服務被調用。發送電子郵件確認。
好的,這可能與第一個例子有關。這裏的問題是,誰負責編排這筆交易?當然,我可以通過注入服務將所有內容放入MVC控制器中。但是如果我想要真正的DDD,所有的業務邏輯都應該在域中。但是哪個實體應該有「購買」方法? Song.Purchase()
? Order.Purchase()
? OrderProcessor.Purchase()
(域名服務)? ShoppingCartService.Purchase()
(應用服務?)
這是一種情況,我認爲在域實體內使用真正的業務邏輯非常困難。如果向實體注入任何東西都不是好習慣,他們怎麼能做其他事情而不是檢查自己(及其總體)的狀態?
我希望這些例子足夠清楚地表明我正在處理的問題。
DDD建議使「文件」和「電子郵件」實體成爲域的一部分。當相應的實體出現在域層中時,基礎設施負責實際生成文件並實際發送電子郵件。 – Lightman