實體(Entity)
具有惟一標識的領域對象。通過標識來區分不同的實體。實體具有惟一性。
註:領域就是特定的問題域 如 訂單領域 商品領域,是描述事物的一個模型
值對象(Value Object)
和實體不同,值對象沒有標識。不需要跟蹤值對象的標識和值對象狀態的維護,值對象非常容易建立和丟棄。大多數的時候,值對象只包含資料,不包含行為。值對象最好是不可變的,也就是說,值對象用一個建構函式建立,所有的屬性都是唯讀,不需要維護值對象的狀態。不可變的值對象是可以共用的。
區分實體和值對象的準則:關心對象的標識,對象是惟一的,則為實體。
彙總(Aggregate)
通過定義對象之間的清晰的所屬關係和邊界來實現領域模型的內聚。並避免了錯綜複雜的難以維護的對象關係網的形成。彙總定義了一組具有內聚關係的相關集合,我們把彙總看作是一個工作單元
彙總的特點:
1、每個彙總有一個根(彙總根)和一個邊界,邊界定義了一個彙總內部有哪些實體或值對象,根是彙總內部的一個實體。
2、 彙總根可以引用其他彙總根,通常通過ID(標識)關聯,彙總內的對象之間可以相互引用。彙總根是外部存取彙總內部對象的媒介,換句話說,彙總外部如果訪問彙總內部的對象時,必須通過彙總根開始導航,不允許直接存取彙總內部的對象。
3、彙總根的標識是整個彙總的標識。
4、彙總是一個單元,我們從資料庫或者其他儲存中重建彙總(讀取對應領域中的重建, new 對應領域中的建立),也是讀取整個彙總,而不能直接查詢彙總內部的某個非根的對象。刪除一個彙總根時,必須同時刪除該彙總中的所有相關的對象。彙總是一個完整的整體,不可分割。
彙總根(Aggregate root)
彙總中的一個實體。
區別彙總根:
1、有獨立存在的意義,即它是不依賴於其他對象的存在它才有意義。
2、可以被獨立訪問,還是必須通過某個對象導航得到的。
服務(Service)
這裡的服務不是我們與soa沒有關係。有時在設計領域模型時,有某些行為不適合放到任何一個類中,我們通常會建立一個服務類,用來維護這些行為。服務類沒有內部狀態,可以簡單地作為一個提供操作的介面實現,服務通常協調一個或多個領域對象工作。需要注意的是 服務可以放到應用程式層、領域層、基礎服務層
應用程式層服務(Application Service)
應用程式層中的服務通常協調放到其他層中的服務工作,大多數情況下,應用程式層中的服務多數是流程性質的。
領域層服務(Domain Service)
處理領域內部的值對象 實體的互動。
基礎層服務()
通常存放的是與業務無關的服務,如郵件通知服務。
倉儲(Repository)
倉儲的職責是將領域對象持久化到資料庫或者其他的儲存介質,或者當需要領域對象時從資料庫中重建領域對象。倉儲的下層是資料庫,上層是服務。從更廣義的角度來理解,我們經常會像集合一樣從某個類似集合的地方(資料庫)根據某個條件擷取一個或一些對象。在這個集合中添加或移除對象。倉儲就是提供了類似集合介面來協助我們管理對象。或者更直白的說,倉儲是資料庫中的資料在記憶體中的表現。通常倉儲包含2個部分,倉儲的定義部分(介面)、倉儲實現部分(介面的實作類別),通常倉儲的定義部分存放在領域模型中 ,實現部分存放在基礎服務層。儘管倉儲可以像集合一樣在記憶體中管理對象,但是倉儲不負責事物處理,一般的事物處理交由 工作單元(Unit Of work)
工廠(Factory)
簡單的領域對象的建立可以通過建構函式來處理。工廠則是用來封裝建立一個複雜物件尤其是彙總時所需的。
領域層
領網域服務 實體 值對象 構成領域層