首页 > 解决方案 > 当我没有 ID 时执行 CQRS 命令

问题描述

我目前正在开发一个具有登录页面的 CQRS 应用程序。在 中LoginCommand,从数据库中获取一个用户,如果它可以登录(加密密码与给定的加密密码匹配),则会为该用户分配一个令牌。

在 CQRS 中,命令通常接收命令所针对的元素的 ID,以便获取它标识的域聚合并在其上执行逻辑。但是,在这种情况下,我从用户那里得到的是电子邮件。尽管这是一个独特的字段,但我不确定使用该字段来获取聚合是否是错误的,尽管它是一个独特的字段。

我还可以考虑具有相同问题的其他情况,例如尝试Post通过不包含帖子 ID 的给定语义 URL 来识别。

由于禁止在命令中执行查询,并且不太可能从登录表单中附加用户 ID,在这种情况下我必须使用哪些选项来获取用户?我应该在命令(例如控制器)之外查询读取模型吗?

标签: authenticationcommanddomain-driven-designcqrs

解决方案


在这种特殊情况下,我认为 CQRS 不会对您的设计产生任何影响。也许事件溯源可能会。

如果你有一些自然键,那么你有几个选择。一方面,它必须是独一无二的。除了 id 之外,您UserRepository可能还有一个使用电子邮件地址来获取用户的方法:

public interface IUserRepository
{
    User Get(Guid id);
    User Find(string email);
}

Find当我可能返回时,我倾向于使用方法nullGet表明实体应该存在并且在找不到时会抛出异常。

如果您只想在那时找到,id则需要id使用email来自某个商店的查找。根据您的一致性要求,最终一致的查询/读取存储可能就足够了,但没有什么可以阻止您访问具有电子邮件到 id 映射的 100% 一致的存储。


推荐阅读