首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整洁的架构当前用户获取

整洁的架构当前用户获取
EN

Stack Overflow用户
提问于 2020-07-04 22:36:00
回答 1查看 757关注 0票数 1

在Clean Architecture用例中,应该知道身份验证/授权过程,命令/查询层应该使用某个框架在下面的层中实现身份验证服务的一些抽象,还是应该将用户标识符作为命令/查询的一部分进行传递?

选项:

选项1:

代码语言:javascript
复制
class ChangePasswordCommand {

    char[] newPassword;
}

class ChangePasswordCommandHandler {

    AuthService authService;

    void handle(ChangePasswordCommand command) {
        User currentUser = authService.currentUser();
        // logic
    }
}

选项2:

代码语言:javascript
复制
class ChangePasswordCommand {

    UUID userId;
    char[] newPassword;
}

class ChangePasswordCommandHandler {

    UserRepository userRepository;

    void handle(ChangePasswordCommand command) {
         User currentUser = userRepository.findById(command.getUserId());
         // logic
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 19:25:20

当您谈到用例时,这是您的应用程序的领域。所以,为了回答这个问题,我可以说:它取决于这个领域。

如果您的域是关于“用户管理”的(例如: LDAP应用程序),那么是的!您需要在您的域中实现它。

否则,这只是一个技术问题,您可以在域外管理它(并直接调用存储库)。

示例:

假设您有一些第三方身份验证提供商提供了具有以下字段的用户结构: id、电子邮件地址等。

要在没有业务规则的情况下对用户进行身份验证,您可以从应用层调用放在基础结构层中的身份验证器。

代码语言:javascript
复制
    userApplication.authenticate(String login, String password) {
        userProvider.authenticate(login, password);
    }

另一方面,如果您希望在对用户进行身份验证时应用一些业务规则,则必须从应用层调用用户域API (放在域层的接口)。

下面的代码只是一个示例。你得把它弄干净。

应用层:

代码语言:javascript
复制
    userApplication.authenticate(String login, String password) {
        userAPI.authenticate(login, password);
    }

域层:

代码语言:javascript
复制
    class Member {
        ...
    }

    interface UserAPI {
        Member authenticate(login, password);
    }

*您可以通过创建一些您想要的工厂或服务或wathever来实现此接口。假设您有一个域UserService。

代码语言:javascript
复制
    class UserService implements UserAPI {
        
        UserSPI userSPI;

        Member authenticate(login, password) {
            // apply some business rules
            userSPI.authenticate(login, password);
        }
    }

    interface UserSPI {
        Member authenticate(login, password);
    }

基础架构层:

代码语言:javascript
复制
    class MemberDTO {
        ...
    }

    class userProvider implements UserSPI {

        private final RemoteProvider remoteProvider;

        Member authenticate(login, password) {
            MemberDTO memberDTO = remoteProvider.authenticate(login, password);
            return memberMapper.dtoToDomain(memberDTO);
        }
    }   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62730429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档