gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:29:20 25 4
gpt4 key购买 nike

我最近发现领域驱动设计 (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 的简单示例吗?

我不喜欢下面给出的示例(在答案中),因为域对象除了携带数据之外没有执行任何操作,这仍然是一个贫乏的模型。任何人都可以通过在域对象内进行一些行为来帮助我提供一个清晰的示例吗?

最佳答案

这是一个很有意义的问题,但我会尝试在某种程度上回答它。我强烈建议您查看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()));
}
}

关于java - 服务在领域驱动设计中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39575516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com