服务在域驱动设计中的作用

时间:2016-09-19 14:22:10

标签: java domain-driven-design anemic-domain-model

我最近发现域驱动设计(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来创建域/业务对象,那么要遵循的命名约定是什么?是CustomerBO,ProductBO等。?

你能帮我看一下使用Java的简单例子吗?

我不喜欢下面给出的示例(在答案中),因为域对象除了携带数据之外没有做任何事情,这仍然是一个贫血模型。任何人都可以通过在域对象中使用某些行为来帮助我一个明确的例子吗?

1 个答案:

答案 0 :(得分:1)

这是一个加载的问题,但我会尝试在某种程度上回答它。 我强烈建议你看看Vaughn Vernon的github sample。他是Implementing Domain Driven Design的作者。

服务的定义在您提供的SO链接中非常好地列出。因此,我将为您提供样本代码以使用该描述进行摘要。

以身份访问域中的租户配置为例。

以下是Vaughn的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()));
    }
}