Rob*_*ert 1 domain-driven-design ddd-service
我正在使用DDD构建身份验证微服务/域,我仍然无法识别每个服务所属的位置.此时我不确定身份验证服务是属于域服务还是应用程序服务.
我应该在域serrvice中包装此行为,并通过应用程序服务公开响应对象,或者这应该保持原样 - 作为应用程序服务.
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
};
}
}
Run Code Online (Sandbox Code Playgroud)
Application Services协调应用程序流和基础结构,但不执行业务逻辑规则或不变量.通常会看到对存储库,工作单元的调用,以及接受和返回服务合同对象或请求/响应对象.它们通常不接受或返回域实体或值对象.
域服务不了解基础架构或整体应用程序流 - 它们专门封装业务逻辑规则.它们接受域实体或值对象,对这些实体或对象执行条件操作,或执行业务规则计算,然后返回基元或域实体或值对象.
基于这些概念,您的示例服务肯定是一个应用程序服务,因为它与您的存储库和工作单元交互,并返回"UserResponse"类型("响应"类型听起来不像域实体).
您的应用程序服务AuthenticationService委托给一个名为的服务UserTokenFactory. UserTokenFactory接受域实体(用户)并返回域valueobject(usertoken).据推测,它以与基础架构无关的方式封装了与创建用户令牌相关的业务规则.因此,这看起来更像是域服务.负责创建域概念(如实体和值对象)的工厂只是一种特殊类型的域服务(在我看来),尽管您最常见的是"域服务"指的是执行某些需要的业务逻辑的服务协调多种类型的实体.
所以 - 我认为你的结构是合适的 - 你有一个应用服务协调基础设施和流程,它委托一个特殊的服务来执行业务逻辑.