【发布时间】:2021-10-01 12:57:45
【问题描述】:
我目前正在构建一个应用程序,我想使用微服务。 我使用 Mediatr 实现 CQRS 模式,使用 EventStore 进行事件溯源。
在创建聚合事件并将其附加到 EventStore 之前检查实体是否存在时遇到问题。
例如:我有 LanguageAggregateRoot
public class LanguageAggregateRoot
{
public Guid Id {get;set}
public string Code { get; private set; }
public string Name { get; private set; }
public bool Enable { get; private set; }
public string Icon { get; private set; }
}
字段Code 是唯一的,用户可以更改语言代码。
当我使用 Code 字段作为 eventstore 的流 id 时,如果用户发送 CreateLanguageCommand 和 ChangeCodeCommand,我需要检查新代码是否存在。
所以我使用 Id 字段作为流 id。但我不明白如何验证代码字段是否唯一?
据我所知,不应在命令处理中使用查询处理。
如果我使用客户端检查是否存在,则将命令发送到服务器。我觉得不好看因为某事/某人在没有我的客户的情况下只能请求命令。
我该怎么做?
感谢您的支持。
【问题讨论】:
-
在你的 rest api 层——控制器中执行它。它们是您的业务逻辑的真正客户端,而不是最终用户的浏览器——这是 API 的客户端。该层应该可以访问查询和命令端,并且可以在创建命令之前验证用户输入。
-
所以,Api层——RestApi或OData Controller,GrpcService——GrpcBase或GraphQL层是业务逻辑的客户端。对吗?谢谢你。
标签: asp.net-core microservices domain-driven-design cqrs event-sourcing