<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          DDD之模塊、工廠和資源庫

          共 1986字,需瀏覽 4分鐘

           ·

          2021-07-04 04:34

          模塊

          在DDD中,模型中的模塊表示了一個命名的容器,用于存放領域中內(nèi)聚在一起的類。將類放在不同模塊中的目的在于達到松耦合性。我們可以把DDD中的模塊理解成一個功能單元的抽象,它的邊界范圍應該是在聚合之上的。

          通過電商實例來理解:

          對于顧客來說,一般需要維護顧客的個人信息、收貨地址、支付方式。這些信息是緊密相關的,不可獨立存在。我們可以抽象出三個簡單的聚合CustomerAddressBook和?Wallet。那這些類該如何存放呢?是為每一個聚合創(chuàng)建一個文件夾存放還是放在同一個文件夾?我想答案不言而喻。

          這三個聚合就是一個模塊,一個客戶模塊。通過定義一個Customer文件夾,來將相關聯(lián)的領域?qū)ο蠼M合起來。而這個文件夾體現(xiàn)在C#中就是命名空間的概念。

          b8fa78b29767a89b8d39e4c52165726e.webp

          在復雜的領域模型中,為了對領域模型中進行準確建模,需要將領域模型拆分成多個子域,每個子域?qū)粋€或多個限界上下文。在限界上下文中,可以將限界上下文中具體的領域概念分解成不同的模塊。所以,從子域到限界上下文再到模塊,應該是依次包含關系。

          89b0cb44593e8fa4548796e010a5aa76.webp

          信息來源:https://mp.weixin.qq.com/s/VOnUjxpz1TB1VAjz2EoxxQ

          對于模塊的設計應具備以下幾個要素:

          • 模塊內(nèi)容應具備領域概念,不是簡單的按照功能或者領域工具(聚合、工廠、實體、值對象等)進行分類存儲,它應該代表這一些列領域工具所抽象出的那個領域概念。

          • 使用通用語言來命名模塊,這種命名方式的好處是能夠更加凸顯領域概念。

          • 模塊間要具有高內(nèi)聚、松耦合性


          工廠

          在針對大型的復雜領域進行建模時,聚合、實體和值對象之間的依賴關系可能會變得十分復雜。在某個對象中為了確保其依賴對象的有效實例被創(chuàng)建,需要深入了解對象實例化邏輯,我們可能需要加載其他相關對象,且可能為了保持其他對象的領域不變性增加了額外的業(yè)務邏輯,這樣即打破了領域的單一責任原則(SRP),又增加了領域的復雜性。這個時候采用模型工程就能有效的解決聚合的復雜性。說白了使用工廠來創(chuàng)建對象的目的就是為了降低聚合的復雜性,而工廠生產(chǎn)的對象雖然屬于模型,但不承擔該模型的任何指責。

          對象創(chuàng)建不是一個領域的關注點,但它確實存在于應用程序的領域?qū)又小Mㄟ^使用工廠可以有效的保證領域模型的干凈整潔,以確保領域模型的對現(xiàn)實的準確表達。使用工廠具有以下好處:

          • 工廠將領域?qū)ο蟮氖褂煤蛣?chuàng)建分離。

          • 通過使用工廠類,可以隱藏創(chuàng)建復雜領域?qū)ο蟮臉I(yè)務邏輯。

          • 工廠類可以根據(jù)調(diào)用者的需要,創(chuàng)建相應的領域?qū)ο蟆?br />

          • 工廠方法可以封裝聚合的內(nèi)部狀態(tài)。

          資源庫

          資源庫是對資源訪問的抽象。不局限于數(shù)據(jù)庫、文件、網(wǎng)絡存儲。接口需要不依賴于具體的數(shù)據(jù)存儲和ORM實現(xiàn)框架。其實,就是聚合的訪問抽象入口,有點類似日常開發(fā)中的facade層,只不過它是針對聚合中實體的操作。每一種聚合類型都將擁有一個資源庫,通常來說,聚合類型和資源庫是一對一的關系,然而有時,當兩個或多個聚合位于同一個對象層級中時,他們可以共享同一個資源庫。

          資源庫分為兩種,一種是基于集合的,一種是基于持久化的。顧名思義,基于集合的資源庫具有編程語言中集合的特征。舉個例子,Java中的List,我們從一個List中取出一個元素,在對該元素進行修改之后,我們并不用顯式地將該元素重新保存到List里面。因此,面向集合的資源庫并不存在save()方法。比如,對于上文中的User,其資源庫可以設計為:

          public interface CollectionOrientedUserRepository {  public void add(User user);  public User userById(String userId);  public List allUsers();     public void remove(User user); }

          對于面向持久化的資源庫來說,在對聚合進行修改之后,我們需要顯式地調(diào)用sava()方法將其更新到資源庫中。依然是User,此時的資源庫如下:

          public interface PersistenceOrientedUserRepository {  public void save(User user);   public User userById(String userId);   public List<User> allUsers();      public void remove(User user); }

          在以上兩種方式所實現(xiàn)的資源庫中,雖然只是將add()方法改成了save()方法,但是在使用的時候卻是不一樣的。在使用面向集合資源庫時,add()方法只是用來將新的聚合加入資源庫;而在面向持久化的資源庫中,save()方法不僅用于添加新的聚合,還用于顯式地更新既有聚合。










          瀏覽 174
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲高清网站 | 久久艹逼视频 | 插插视频无码一区 | 欧美性久久久 | 国产精品久久777777是什么意思 |