在Clean Architecture用例中,应该知道身份验证/授权过程,命令/查询层应该使用某个框架在下面的层中实现身份验证服务的一些抽象,还是应该将用户标识符作为命令/查询的一部分进行传递?
选项:
选项1:
class ChangePasswordCommand {
char[] newPassword;
}
class ChangePasswordCommandHandler {
AuthService authService;
void handle(ChangePasswordCommand command) {
User currentUser = authService.currentUser();
// logic
}
}选项2:
class ChangePasswordCommand {
UUID userId;
char[] newPassword;
}
class ChangePasswordCommandHandler {
UserRepository userRepository;
void handle(ChangePasswordCommand command) {
User currentUser = userRepository.findById(command.getUserId());
// logic
}
}发布于 2020-07-13 19:25:20
当您谈到用例时,这是您的应用程序的领域。所以,为了回答这个问题,我可以说:它取决于这个领域。
如果您的域是关于“用户管理”的(例如: LDAP应用程序),那么是的!您需要在您的域中实现它。
否则,这只是一个技术问题,您可以在域外管理它(并直接调用存储库)。
示例:
假设您有一些第三方身份验证提供商提供了具有以下字段的用户结构: id、电子邮件地址等。
要在没有业务规则的情况下对用户进行身份验证,您可以从应用层调用放在基础结构层中的身份验证器。
userApplication.authenticate(String login, String password) {
userProvider.authenticate(login, password);
}另一方面,如果您希望在对用户进行身份验证时应用一些业务规则,则必须从应用层调用用户域API (放在域层的接口)。
下面的代码只是一个示例。你得把它弄干净。
应用层:
userApplication.authenticate(String login, String password) {
userAPI.authenticate(login, password);
}域层:
class Member {
...
}
interface UserAPI {
Member authenticate(login, password);
}*您可以通过创建一些您想要的工厂或服务或wathever来实现此接口。假设您有一个域UserService。
class UserService implements UserAPI {
UserSPI userSPI;
Member authenticate(login, password) {
// apply some business rules
userSPI.authenticate(login, password);
}
}
interface UserSPI {
Member authenticate(login, password);
}基础架构层:
class MemberDTO {
...
}
class userProvider implements UserSPI {
private final RemoteProvider remoteProvider;
Member authenticate(login, password) {
MemberDTO memberDTO = remoteProvider.authenticate(login, password);
return memberMapper.dtoToDomain(memberDTO);
}
} https://stackoverflow.com/questions/62730429
复制相似问题