DDD - 概述 - 模塊 (二)

首先,你必須知道如下DDD構建塊:數據庫

  1. Entities - 實體緩存

  2. Value objects - 值對象網絡

  3. Aggregate roots - 聚合跟架構

  4. Repositories - 倉儲對象併發

  5. Factories - 工廠dom

  6. Services - 服務測試

 

1. 實體

一個實體是一個普通對象,有一個身份(ID)和多是可變的。每一個實體都由一個唯一標識ID而不是由一個屬性;所以,若是他們兩實體有相同的ID,兩個實體能夠被認爲是相同的,即便他們有不一樣的屬性。這意味着實體的狀態隨時能夠改變,但只要兩個實體具備相同的ID,都是相等的.spa

2. 值對象

值對象是不可變的。他們沒有身份(ID)像咱們發現實體。若是他們有相同的類型和屬性(適用於全部的屬性),那麼這兩個值對象能夠被認爲是相等的。有時候咱們在咱們的洋蔥架構中須要進行消息傳遞的時候咱們能夠經過使用值對象去傳遞,從而能避免直接暴露領域對象.值對象的一些好處:對象

  1. 值對象的使用能夠吞下大量的計算複雜度。接口

  2. 分解掉實體的部分邏輯,從而讓實體的邏輯簡化。

  3. 提升可擴展性,好比解決可測試性和併發性的問題.

3.聚合根

聚合根是一個實體與其餘實體結合在一塊兒。此外,聚合根其實是一個整體的一部分(收集/集羣相關的對象看成一個單獨的單元爲目的的數據改變)。所以,每一個聚合實際上由一個聚合根和一個邊界構成。好比,在銷售訂單 中,訂單Order和訂單項OrderLineItem能夠被認爲是一個聚合,這裏的Order(訂單)是聚合根對象,這個訂單項(orderlineItem)就是訂單的子對象.一個聚合根的關鍵特性之一就是外部對象不容許持有一個聚合根子實體。所以,若是您須要訪問一個聚合根子實體(即總),那麼你必須通過聚合根(即不能直接訪問某一個聚合的子對象)。另外一個是域內的全部操做應在可能的狀況下,通過一個聚合根。工廠、倉庫和服務有一些例外.

4. 倉儲

倉庫主要是用來處理存儲。在DDD中它是一個最重要的概念.由於他們有大量的存儲問題中抽象出來(即某種形式/存儲機制)。多是一個基於文件的存儲庫實現存儲,或數據庫(SQL - / NoSQL-based),或任何其餘有關存儲機制,如緩存。任意組合的也是可能的。倉儲與數據存儲不是一個東西不要混淆。倉儲是爲數據存儲(數據庫)服務的。倉儲的實現可能須要使用到多個數據源對象。所以,一個聚合根可能來自一個REST API,以及數據庫或文件。你可能包裝那些所謂的數據存儲,但存儲庫是一種進一步的抽象層上全部的我的數據存儲。一般,我實現域/域內的存儲庫爲一個接口服務層內洋蔥架構,而後存儲庫的實現邏輯接口中定義的基礎設施層。

5. 工廠

就是咱們一般理解的工廠的概念,在DDD中,確切地說在聚合對象中,工廠一般用來返回 一個聚合跟 或一個實體或 一個值對象.不少時候,當你須要一個聚合根的工廠方法,在repository(倉儲中)使用。所以,(repository)存儲庫可能有一個查找器建立方法。一般的 工廠是在domain/domain services layer(領域或領域服務層)定義的接口對象,實現邏輯是在infrastructure layer(基礎設施曾)中的. 也就是說 infrastructure 中定義的是 domain/domain service層的工廠接口的實現.

6. 服務

某一部分的操做並很差歸結到某一個領域對象,並不適合建立聚合,那麼這時候能夠考慮建立成services(服務)對象.

其餘

我常常發現許多開發人員使用術語VO(值對象)和DTO(數據傳輸對象)互換。他們認爲都是相同的。這對我來講很煩人。這裏我想澄清,指的是不一樣的東西。下圖中所示,簽證官和DTO的子集POJO /少。一個實體POJO /少也是一個子集。在上面的描述,POJO和少能夠互換使用。都是指的是相似的事情。都只是域對象,主要表明域/業務應用程序中的業務對象。POJO(傳統的普通Java對象)這個詞是由馬丁在Java社區,很是受歡迎,而少(普通CLR對象/普通類對象)被普遍用於dotNet。如前所述,DTO,簽證官和實體POJO /少的只是一個子集.DTO只是一個簡單的數據載體(只有持有數據沒有任何邏輯)。所以,它的通常貧血(只包含屬性和getter / setter)。DTO絕對是不可變的。一般,咱們使用DTO轉讓對象層和層之間的一個應用程序或應用程序到應用程序或JVM JVM(主要是有用的網絡之間減小多個網絡調用)。

相關文章
相關標籤/搜索