authentication - 当我没有 ID 时执行 CQRS 命令
问题描述
我目前正在开发一个具有登录页面的 CQRS 应用程序。在 中LoginCommand
,从数据库中获取一个用户,如果它可以登录(加密密码与给定的加密密码匹配),则会为该用户分配一个令牌。
在 CQRS 中,命令通常接收命令所针对的元素的 ID,以便获取它标识的域聚合并在其上执行逻辑。但是,在这种情况下,我从用户那里得到的是电子邮件。尽管这是一个独特的字段,但我不确定使用该字段来获取聚合是否是错误的,尽管它是一个独特的字段。
我还可以考虑具有相同问题的其他情况,例如尝试Post
通过不包含帖子 ID 的给定语义 URL 来识别。
由于禁止在命令中执行查询,并且不太可能从登录表单中附加用户 ID,在这种情况下我必须使用哪些选项来获取用户?我应该在命令(例如控制器)之外查询读取模型吗?
解决方案
在这种特殊情况下,我认为 CQRS 不会对您的设计产生任何影响。也许事件溯源可能会。
如果你有一些自然键,那么你有几个选择。一方面,它必须是独一无二的。除了 id 之外,您UserRepository
可能还有一个使用电子邮件地址来获取用户的方法:
public interface IUserRepository
{
User Get(Guid id);
User Find(string email);
}
Find
当我可能返回时,我倾向于使用方法null
,Get
表明实体应该存在并且在找不到时会抛出异常。
如果您只想在那时找到,id
则需要id
使用email
来自某个商店的查找。根据您的一致性要求,最终一致的查询/读取存储可能就足够了,但没有什么可以阻止您访问具有电子邮件到 id 映射的 100% 一致的存储。
推荐阅读
- javascript - 在 () -> fn 上传递对 onClick 的引用是否对性能有真正的影响?在反应
- matplotlib - 使用 matplotlib,有没有办法创建基本不等式的简单二维图
- python - 使用电子邮件收集功能制作基于 python 的网站,但在输入电子邮件时崩溃
- firebase - 如何将 firebase CLI 调试文件(即 ui-debug.log、firebase-debug.log)输出文件夹更改为单独的日志文件夹?
- powershell - “InputObject”如何为空?
- java - 是否有用于侦听音频命令的 Kotlin 或 Java 库?(想要在孩子们大喊“TRICK OR TREAT”时触发万圣节展示)
- sql - 使用 SQL 从匹配的 meta_key 中检索所有帖子
- json - 预期解码 Int 但找到了一个数组
- javascript - 在数据列表中创建间距
- javascript - 打字稿意外令牌