簡體   English   中英

哪一層負責業務邏輯?

[英]Which layer is responsible for the business logic?

我正在開發一個基於領域驅動設計的項目。

在這個項目中,我們有 5 層:

  1. 基礎設施
  2. 領域
  3. 申請服務
  4. 分布式服務
  5. 介紹

我對如何將我的業務邏輯放在基礎設施、域和服務層之間感到困惑。 有時我將業務邏輯條件放在存儲庫中的 iqueryable Linq 中; 有時我將所有對象加載到內存中並將它們放入服務中; 有時我把它們放在一個對象的方法中。 我不知道哪種方式是正確的方式。 哪個層應該負責這個業務邏輯?

我需要一些具體的理由來說服開發團隊,代碼中的業務邏輯更好,因為它更易於維護。 我曾經在 DB 中有很多業務邏輯,因為我相信它是單點訪問。

存儲過程對於加速某些數據庫操作很有用。 存儲過程是邪惡的,因為:

  • 很難進行版本控制(不是最難的事情,但比對項目進行版本控制更難)
  • 部署起來更難(例如,在我的工作中,我們在幾台服務器上有數千個數據庫和數千個存儲過程;當我們更改 SP 的邏輯時,我們必須更新每個數據庫:頸痛。)
  • 很難調試,
  • 很難進行單元測試

說......存儲庫的實現是基礎設施,基礎設施不知道域和業務邏輯。 畢竟我在這個問題中真的看不到 DDD,也許你應該深化實體、值對象和聚合根等概念,以及存儲庫和域模型。

我們現在唯一可以確認的是:作為領域邏輯的業務邏輯屬於領域模型/領域層。 域邏輯是除了用例之外總是以相同方式運行的規則(例如:如果訂單比 100 美元更貴,則發貨是免費的)。 如果您有一個取決於用例的規則(例如:如果用戶使用 appmobile 瀏覽我的電子商務而不是...),這就是應用程序邏輯。

DDD 還遵循“關注點分離”規則,因此圍繞域的業務留在域層中,如果域外的某些東西是依賴的,那么我們將它們放在更高的層中,例如表示層中的模型視圖。

我知道這是舊的,但我有一些在舊項目上工作的經驗,其中數據庫包含所有邏輯,並且各種系統使用該邏輯。 更新這些系統中的任何一個都變成了一場噩夢,對其中任何一個進行更改都會破壞其他地方的某些內容。

DDD 旨在解決這些確切的場景。

把它想象成你有一個集中的應用程序來控制它的域,定義域通常很困難,但假設你可以定義一個具有 3 個域的傳統系統。

Commerce Domain 控制如何接受訂單。

物流域控制如何運送訂單。

訂單支付方式的計費域。

理想情況下,這些域中的每一個都可以表示分層應用程序,但“訂單”的整個端到端故事涉及所有 3 個應用程序。 每個域都控制着它的業務,並負責以最好的方式完成它的工作。

Billing Domain 可以像一個 web api 一樣簡單,它將訂單數據附加到一個 csv 文件,會計人員每個月打開一次並手動輸入發票。 或者它可以成長為一個巨大的復雜的快速集成野獸,自動從保存的帳戶中提取資金。 Commerce and Logistics 域不應該關心計費域在哪里保存數據或如何獲得報酬。 他們只負責在商品售出和發貨時通知計費域。

Commerce 域同樣不必關心運費是如何計算的,它只需要詢問 Logistics 域即可。 Commerce 不應該在 Logistics 需要的數據庫中扎根,因為如果 Logistics 想要調整並使用谷歌地圖來確定運輸成本,那么我們也需要更新 Commerce。

一旦你理解了“每個域都控制它的數據,如果你需要那個域數據,你就問那個域”的概念。 接下來的位有點符合。

每個域都有一個或兩個表示層,可以是網站、api、移動/桌面應用程序或以上的組合。 每個域將在域/應用程序層中具有業務邏輯。 每個域都將得到數據庫和 API 等基礎設施的支持。

在上面的例子中,我們可以有一個商務域。 它的表示層向用戶呈現一個網站,它的域層由 OrderPage 和命令/查詢接口組成。 它的基礎設施層具有處理這些命令和查詢的邏輯,其中大部分可能會轉到私有數據庫,但我們也有一些 api 調用到物流和計費域。

我們的計費域在其表示層中有 2 個項目。 一個是用於處理來自商業和物流域的請求的 API,另一個是我們為會計編寫的桌面應用程序。 它們都與相同的域對象/接口通信,因此如果會計需要登錄並手動修改訂單,他們可以像在網站上那樣輕松地進行操作。 域中的接口由基礎設施實現,基礎設施可以是一個 quickbooks api,它也將數據轉發到新書,直到大遷移完成。 Commerce and Logistics 中的任何代碼都不必關心新鮮書/速記本,如果我們願意,我們可以同時使用兩者。

我們的 Logicstics 域在其表示層中同樣有兩個項目。 一個控制台應用程序,每天早上在計划任務上運行一次,以批量處理訂單和 API。 同樣處理它的數據。

好吧,這有點太長了,我要結束了。 無論如何,沒有人可能會在 4 年前的帖子上閱讀這個答案,哈哈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM