“企業級應用系統”具有復雜的業務,和相對較長的生命周期,在其生命周期中,業務規則將會是經常變化的,所使用的技術也可能發生變更。為了后期能更好的對這類系統進行擴展和維護,我們可以選擇面向領域的多層架構,降低組件之間、層與層之間的耦合,這樣在每次業務邏輯發生變化或者有新的業務擴展時,我們都能將變化鎖定在領域層,從而最大限度的降低對其他層的影響。
領域驅動架構通常分為四層:表示層、應用層、領域層和基礎設施層。
表示層(Presentation)
該層的主要職責是通過用戶界面向用戶顯示數據信息,同時解釋用戶的命令,並把用戶的請求發送到應用層。
應用層(Application)
應用層主要用於協調不同領域對象之間的動作或領域模型與基礎結構層組件之間的工作,以完成一個特定的、明確的系統任務。
有一個需求是保存一個訂單后,需要發送一封Email給用戶。保存訂單是業務,業務代碼在領域層中;而發送Email則應是基礎設施層的功能,那么就需要使用應用層來協調領域對象和基礎設施對象之間的動作。
領域模型層(Domain Model)
將業務邏輯高度內聚到領域層,所以領域層是整個系統的核心,它只與實際業務相關,不應關心任何技術細節,盡可能的做到與持久化無關。
-
實體
實體在領域模型中非常重要,由標識來區分的對象稱為實體(即標識必須唯一)。
-
值對象
和實體不同,值對象沒有標識,不需要跟蹤值對象的狀態,而且值對象非常容易創建和丟棄。值對象是不可變的,用一個構造器創建,所有屬性都定義為只讀。如果其中一個屬性需要修改,那么就需要重新創建一個新的值對象來進行整體替換。值對象的相等性比較是通過各個屬性值的比較來完成的。
-
領域層服務
在設計領域模型時,有些業務行為不適合放在任何一個領域對象中,或者該業務行為需要聯合多個領域實體才能完成,那么我們就把其放在對應的領域服務中。領域層服務負責和領域中的實體對象、值對象以及其他領域層對象交互。
-
聚合(Aggregate)
聚合通常定義一組關聯的對象,以及對象和關系之間的邊界,作為一個數據更改的單元處理。每個聚合只有一個聚合根(實體對象)。聚合根可以引用其他聚合根,聚合內的對象可以引用聚合內的另一個對象,但是聚合邊界外的任何對象不能繞過聚合根對象訪問聚合內的對象。
-
倉儲(Repository)
為每一個聚合根對象創建一個倉儲,表示該種類型的所有對象為一個概念的對象集合,對倉儲的訪問通過類似集合的接口。倉儲的要點是讓開發人員將精力聚焦在領域模型邏輯上,並將真實的數據訪問隱藏在倉儲接口后面,這就是之前說的領域模型與持久化無關。
-
工廠(Factory)
很多時候,構造一個聚合以及其所有的關系、約束、規則等比較復雜,讓一個實體對象自己負責對象的創建就會使得代碼變得混亂。此時就需要有一個工廠,能夠知道如何構建這些類型的對象,並統一進行創建。
基礎設施層(Infrastructure)
基礎設施層包含任何類型的框架、數據訪問代碼或者公共的幫助方法等,是純技術的一層。