gpt4 book ai didi

domain-driven-design - 这是域还是应用程序服务

转载 作者:行者123 更新时间:2023-12-03 23:14:47 24 4
gpt4 key购买 nike

我正在使用 DDD 构建身份验证微服务/域,但我仍然无法识别每个服务的所属位置。此时我不确定身份验证服务属于域服务还是应用程序服务。

我应该将此行为包装在域服务中,并通过应用程序服务公开响应对象,还是应该保持原样 - 作为应用程序服务。

public class AuthenticationService : IAuthenticationService
{
IAuthUnitOfWork _uow;
IUserRepository _userRepository;
IUserTokenFactory _userTokenFactory;

public AuthenticationService(IUserTokenFactory userTokenFactory, IUserRepository userRepository,
IAuthUnitOfWork uow)
{
_userTokenFactory = userTokenFactory;
_userRepository = userRepository;
_uow = uow;
}

public async Task<UserTokenResponse> AuthenticateAsync(string email, string password)
{
var user = await _userRepository.GetByEmailAndPasswordAsync(email, password);
//TODO: Add null check for user
var userToken = await _userTokenFactory.CreateWithAsync(user);

await _uow.SaveChangesAsync();

return new UserTokenResponse
{
ExpiressOn = userToken.ExpiressOn,
Token = userToken.Token
};
}

}

最佳答案

  • 应用服务协调应用程序流和基础设施,但不执行业务逻辑规则或不变量。对存储库、工作单元以及接受和返回服务契约(Contract)对象或请求/响应对象的调用很常见。它们通常不接受或返回域实体或值对象。
  • 域服务不了解基础架构或整体应用程序流程 - 它们专门封装业务逻辑规则。它们接受域实体或值对象,对这些实体或对象执行条件操作,或执行业务规则计算,然后返回原语或域实体或值对象。

  • 基于这些概念,您的示例服务绝对是一个应用程序服务,因为它与您的存储库和工作单元交互,并返回“UserResponse”类型(“响应”类型听起来不像域实体)。

    您的应用服务 AuthenticationService正在委派一个名为 UserTokenFactory 的服务. UserTokenFactory接受域实体(用户)并返回域值对象(用户 token )。大概它以一种与基础设施无关的方式封装了与创建用户 token 相关的业务规则。因此,这看起来更像是一个域服务。负责创建诸如实体和值对象之类的域概念的工厂只是一种特殊类型的域服务(在我看来),尽管您最常看到的“域服务”指的是执行某些需要的业务逻辑的服务多种类型的实体之间的协调。

    所以 - 我认为你的结构是合适的 - 你有一个应用程序服务协调基础设施和流程,它委托(delegate)给一个特殊的服务来执行业务逻辑。

    关于domain-driven-design - 这是域还是应用程序服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981882/

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