0

我最近发现,对于某些应用程序(即涉及复杂业务逻辑而不是通过 UI 公开的简单 CRUD 操作的应用程序),域驱动设计 (DDD) 是更好的选择。

我浏览了以下有关域驱动设计 (DDD) 的网站。

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

领域驱动设计:领域服务、应用服务

我无法得出结论/理解的是以下几点:

(1) 服务在领域驱动设计 (DDD) 中的作用是什么?你能用一个示例服务、域对象、DAO(使用 Java)来解释吗?

(2) 如果我需要使用 Java 创建域/业务对象,那么要遵循的命名约定是什么?是不是像 CustomerBO、ProductBO 等?

你能帮我用Java的简单例子吗?

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

4

1 回答 1

1

这是一个加载的问题,但我会尝试在某种程度上回答它。我强烈建议查看 Vaughn Vernon 的github 示例。他是《实施领域驱动设计》一书的作者。

您提供的 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()));
    }
}
于 2016-09-19T15:41:52.787 回答