【问题标题】:Is this domain or application service这是域还是应用程序服务
【发布时间】:2016-12-23 05:46:46
【问题描述】:

我正在使用 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
            };
        }

    }

【问题讨论】:

    标签: domain-driven-design ddd-service


    【解决方案1】:
    • 应用程序服务协调应用程序流和基础设施,但不执行业务逻辑规则或不变量。对存储库、工作单元以及接受和返回服务合同对象或请求/响应对象的调用很常见。它们通常不接受或返回域实体或值对象。

    • 域服务不知道基础设施或整体应用程序流 - 它们专门封装业务逻辑规则。它们接受域实体或值对象,对这些实体或对象执行条件操作,或执行业务规则计算,然后返回原语或域实体或值对象。

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

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

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

    【讨论】:

    • 嘿克里斯!我真的很喜欢你在这里简洁的总结。当您说域服务时:“然后返回原语或域实体或值对象”-您能否澄清在哪些情况下?有一个特定的规则可以遵循会很棒。
    • 例如,我目前的理解是:如果域服务要与其他域服务交互,那么返回域实体或值对象是可以的。如果域服务返回到应用程序服务(因为正如您解释的应用程序服务“不接受或返回实体或值对象”),那么您将通过标量保持这种分离。这听起来对吗?
    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2015-06-25
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多