我知道域邏輯應該放入域對象。但是,如果我的域邏輯需要來自數據庫的數據呢? (例如檢查唯一值,計算值等等)我認爲將存儲庫注入到我的域對象中並不是正確的。此外,服務層不應包含業務規則。那麼如何解決這種業務邏輯呢?哪裏需要從數據庫中獲取數據的域邏輯
7
A
回答
3
你是對的,你的域對象不應直接從數據庫中讀取數據。這裏的經典錯誤是域對象通過Web服務發送,並嘗試從數據庫讀取數據,當數據庫位於服務器上而不訪問數據庫時。
有幾種方法可以做到這一點:
- 服務層預加載任何信息的域對象需要
- 域對象可以調用輔助或存儲庫從數據庫 獲取數據
1
我一直覺得服務層是一個合乎邏輯的地方調用這種類型的活動 - 但我會解釋,這不是在那裏我實現了它本身。由於服務層是您進入域的入口,因此您可以確信,無論請求何時啓動對此數據的需求,它都必須通過這一點才能實現。
此外,讓服務與其他服務對話是非常乾淨的,因爲它們專門設計爲需要最小的努力來調用。您可以在存儲庫中公開您需要的適當功能(即可以爲您提供匹配Y條件的X對象的計數的方法/查找程序/查詢),並將其包裝在方便的服務調用中。這不僅可以讓您在單一服務中輕鬆完成任務,還可以在服務之間利用此功能來實現更復雜的需求。
我明白在將業務邏輯放入服務層時需要注意的一點,但根據需求,它是什麼是業務邏輯和什麼是特定於實現的業務邏輯之間的一條細線。在編寫一個系統時,經常會出現一些表面上隱含的業務邏輯但不適合的規則。獨特的約束是我發現的最常見的例子。請記住,就像存儲庫中的所有其他內容一樣,這不是服務層中的實現,而是對域中已有內容的抽象。
我所做的是將「邏輯」本身置於域中,通常以規範模式實現的形式。由於邏輯是在存儲庫中執行的,並且不需要更改服務層,所以我接受了這個完全可以接受的條款。你會發現適用於實體集合的規則通常是「有趣」的規則。如果您只需要驗證聚集根中的某個集合是否具有唯一性,那麼這很簡單。
我已經看到了域對象知道存儲庫的方法,我個人不是粉絲。對我來說,存儲庫是定義域如何與持久層接口(儘管不一定是實現)。事實上,一個實體甚至知道它有一個更大的目的而不僅僅是存在,使事情變得非常複雜。
相關問題
- 1. 我應該在哪裏編寫邏輯從數據庫獲取菜單?
- 2. 從mysql數據庫中獲取不需要的數據? (php)
- 3. 從父子表獲取邏輯數據?
- 4. PHP,在哪裏放多個數據庫操作邏輯?
- 5. 我應該在哪裏放置邏輯數據庫列計算
- 6. 需要幫助從SQLite數據庫獲取數據
- 7. 從哪裏獲取地理數據?
- 8. 邏輯在數據庫
- 9. mysql數據庫邏輯
- 10. 數據庫邏輯建議
- 11. 域邏輯,DAL,數據庫 - 在哪裏放置什麼,在哪裏?以及如何與他們互動?
- 12. 需要驗證數據庫邏輯模式,以第三範式
- 13. 需要從mysql數據庫中獲得產品數據
- 14. 從數據庫邏輯刪除
- 15. 需要從MySQL數據庫中獲取僅今天的結果
- 16. 數據庫邏輯進出數據庫的最佳做法。在數據庫中保存邏輯?
- 17. 需要從數據庫
- 18. 需要從數據庫
- 19. 我從數據庫SQL從數據庫中獲取數據
- 20. 從數據庫更新數據從數據庫獲取數據
- 21. 從語句向量中獲取邏輯值的數據框
- 22. 數據庫層中的業務邏輯
- 23. 從psql數據庫中獲取數據
- 24. 從moodle數據庫中獲取數據
- 25. 從數據庫中獲取數據
- 26. Android從數據庫中獲取數據
- 27. PDO從數據庫中獲取數據
- 28. 從數據庫中獲取數據。
- 29. CodeIgniter從數據庫中獲取數據
- 30. Django從數據庫中獲取數據
個人而言,我更喜歡第二種方法。另一個需要提及的要點是應該抽象出存儲庫,以便域對象/層不與存儲庫緊密耦合。 – 2011-05-16 01:26:46