如果身份验证涉及某些业务逻辑,则不应转到域服务吗?



我正在阅读"实现领域驱动设计";沃恩·弗农的,有一段摘录对我来说听起来很错误。在与服务相关的章节中,我们试图对特定于业务的身份验证过程进行建模:

boolean authentic = false;
Tenant tenant = DomainRegistry
.tenantRepository()
.tenantOfId(aTenantId);
if (tenant != null && tenant.isActive()) {
User user = DomainRegistry
.userRepository()
.userWithUsername(aTenantId, aUsername);
if (user != null) {
authentic = tenant.authenticate(user, aPassword);
}
}
return authentic;

紧接着我们有:

看看我们给客户带来的额外负担。现在需要更多地了解身份验证。

稍后我们有:

客户应该承担的唯一业务责任是协调处理的所有其他详细信息的单个域特定操作商业问题。

紧随其后:

UserDescriptor userDescriptor =
DomainRegistry
.authenticationService()
.authenticate(aTenantId, aUsername, aPassword);

到目前为止,这对我来说完全有意义。

不过,几页后,书中提到了同样的例子:

[…]您可以决定将这个有点技术性的实现类放在一个位置领域模型之外。技术实施可能包含在例如,基础结构层中的模块。

这对我来说也很有意义。

但是,以下代码是这样的:

package com.saasovation.identityaccess.infrastructure.services;
// ...
public class DefaultEncryptionAuthenticationService implements AuthenticationService {
// ...
@Override
public UserDescriptor authenticate(
TenantId aTenantId,
String aUsername,
String aPassword) {
// Guards here
UserDescriptor userDescriptor = null;
Tenant tenant = DomainRegistry
.tenantRepository()
.tenantOfId(aTenantId);
if (tenant != null && tenant.isActive()) {
String encryptedPassword =
DomainRegistry
.encryptionService()
.encryptedValue(aPassword);
User user =
DomainRegistry
.userRepository()
.userFromAuthenticCredentials(
aTenantId,
aUsername,
encryptedPassword);
if (user != null && user.isEnabled()) {
userDescriptor = user.userDescriptor();
}

}
return userDescriptor;
}

这是我不明白的。服务,包括前面提到的业务逻辑(加上一些更详细的信息,即加密(,被放置在基础结构层(见包名称(中,它是域模型的客户端。这意味着最终不满足先前的条件:

看看我们给客户带来的额外负担。现在需要更多地了解身份验证。

这个服务不应该放在域层吗?是什么使它成为基础结构层?假设我们使用的是六边形体系结构,那么基础结构层不是被认为是域层的客户端吗?

基础结构组件不是域层的客户端,它们是域抽象的实现。

通过";客户端";,这本书的作者可能指的是调用域(业务(操作的人。

一般来说,身份验证可以通过各种方式实现,因此将一种或另一种实现放在基础设施层是有意义的;但是认证AS概念被认为是一个领域抽象(例如接口(,如以下代码行所示:

DomainRegistry.authenticationService()

尽管如此,DefaultEncryptionAuthenticationService的例子对我来说还是有些模糊。包名称确实意味着基础设施,但实现涉及几个抽象服务(租户、用户、加密(和一些业务逻辑,这意味着我们实际上在处理域服务。

(为了更好地理解抽象和实现是如何协同工作的,理解依赖反转原理是很重要的(。

我不记得那个特定的书样本,但逻辑是否被视为领域逻辑取决于上下文。例如,在密码学库的上下文中,加密可能是一个领域问题,但在其他一些上下文中,它是一个基础设施问题。

当上下文没有明确定义时;基础设施可能变得模糊。

如果我们查看IDDD的存储库,我们可以看到AuthenticationService在Identity&访问受限上下文。

最新更新