2016-09-19 81 views
0

我最近發現域驅動設計(DDD)對於某些應用程序(即涉及複雜業務邏輯的應用程序而不是通過UI公開的簡單CRUD操作)是更好的選擇。服務在域驅動設計中的作用

我已經瀏覽了域驅動設計(DDD)的下列網站。

https://www.infoq.com/articles/ddd-in-practice

Domain Driven Design: Domain Service, Application Service

我不能得出什麼結論/理解有以下幾點:

(1)什麼是(DDD)領域驅動設計服務的作用是什麼?你能解釋一個例子服務,域對象,DAO(使用Java)嗎?

(2)如果我需要使用Java創建Domain/Business Objects,那麼遵循的命名約定是什麼?是否像CustomerBO,ProductBO等?

你能幫我簡單的例子使用Java嗎?

我不喜歡下面給出的例子(在答案中),因爲域對象除了攜帶數據(這仍然是一個貧血模型)之外沒有做任何事情。任何人都可以通過在域對象內部有一些行爲來幫助我一個明確的例子嗎?

+0

我不喜歡下面作爲域對象沒有做下面任何東西,除了攜帶數據,這是一個貧血模型給出的例子。任何人都可以幫助我一個明確的例子嗎? – developer

回答

1

這是一個加載的問題,但我會盡力回答一些。 我強烈建議您查看Vaughn Vernon的github sample。他是Implementing Domain Driven Design的作者。

服務的定義在您提供的SO鏈接中非常好地排列。所以我打算給你提供示例代碼來消化這個描述。

以配置身份訪問域中的租戶爲例。

下面是沃恩的github上幾個很明顯的例子:

這裏是租戶域對象

package com.saasovation.identityaccess.domain.model.identity; 

    public class Tenant extends extends ConcurrencySafeEntit { 
     public Tenant(TenantId aTenantId, String aName, String aDescription, boolean anActive) { 
     ... 
     } 
     public Role provisionRole(String aName, String aDescription) { 
      ... 
     } 
     public void activate(){} 
     public void deactivate(){} 
     .... 

    } 

租戶

package com.saasovation.identityaccess.domain.model.identity; 

public interface TenantRepository { 

    public void add(Tenant aTenant); 
} 

租客域名服務

package com.saasovation.identityaccess.domain.model.identity; 

public class TenantProvisioningService { 

    private TenantRepository tenantRepository; 

    public Tenant provisionTenant(
      String aTenantName, 
      String aTenantDescription, 
      FullName anAdministorName, 
      EmailAddress anEmailAddress, 
      PostalAddress aPostalAddress, 
      Telephone aPrimaryTelephone, 
      Telephone aSecondaryTelephone) { 

      Tenant tenant = new Tenant(
         this.tenantRepository().nextIdentity(), 
         aTenantName, 
         aTenantDescription, 
         true); // must be active to register admin 

      this.tenantRepository().add(tenant); 

    } 

} 

這是一個應用服務

package com.saasovation.identityaccess.application; 

@Transactional 
public class IdentityApplicationService { 

    @Autowired 
    private TenantProvisioningService tenantProvisioningService; 


    @Transactional 
    public Tenant provisionTenant(ProvisionTenantCommand aCommand) { 

     return 
      this.tenantProvisioningService().provisionTenant(
         aCommand.getTenantName(), 
         aCommand.getTenantDescription(), 
         new FullName(
           aCommand.getAdministorFirstName(), 
           aCommand.getAdministorLastName()), 
         new EmailAddress(aCommand.getEmailAddress()), 
         new PostalAddress(
           aCommand.getAddressStateProvince(), 
           aCommand.getAddressCity(), 
           aCommand.getAddressStateProvince(), 
           aCommand.getAddressPostalCode(), 
           aCommand.getAddressCountryCode()), 
         new Telephone(aCommand.getPrimaryTelephone()), 
         new Telephone(aCommand.getSecondaryTelephone())); 
    } 
} 
+0

我不明白這個例子,爲什麼我們有2個服務? – developer

+0

應用程序服務將是外部消費者用來在該域中執行操作的服務。另一方面,域服務在您的域的內部,並且只處理無法由您的域對象或存儲庫處理的邏輯。如果你看看github中的完整示例,它會給你一個更好的主意。這些只是完整類的片段。 –

+0

抱歉,延遲響應,這裏的域對象的作用是什麼?除了攜帶數據,這是一個貧血模型,它沒有做任何事情。 – developer