【问题标题】:Validate existing entity in CQRS + EventSourcing. Microservice ASP.NET Core 5.0验证 CQRS + EventSourcing 中的现有实体。微服务 ASP.NET Core 5.0
【发布时间】: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 时,如果用户发送 CreateLanguageCommandChangeCodeCommand,我需要检查新代码是否存在。

所以我使用 Id 字段作为流 id。但我不明白如何验证代码字段是否唯一?

据我所知,不应在命令处理中使用查询处理。

如果我使用客户端检查是否存在,则将命令发送到服务器。我觉得不好看因为某事/某人在没有我的客户的情况下只能请求命令。

我该怎么做?

感谢您的支持。

【问题讨论】:

  • 在你的 rest api 层——控制器中执行它。它们是您的业务逻辑的真正客户端,而不是最终用户的浏览器——这是 API 的客户端。该层应该可以访问查询和命令端,并且可以在创建命令之前验证用户输入。
  • 所以,Api层——RestApi或OData Controller,GrpcService——GrpcBase或GraphQL层是业务逻辑的客户端。对吗?谢谢你。

标签: asp.net-core microservices domain-driven-design cqrs event-sourcing


【解决方案1】:

在您的命令本身中验证您的请求应该没问题。 您可以使用以下链接了解更多详情。 CQRS - is it allowed to call the read side from the write side?

【讨论】:

  • 所以,Api层——RestApi或OData Controller,GrpcService——GrpcBase或GraphQL层是业务逻辑的客户端。对吗?谢谢你。
  • @MinhMít 我会避免将处理命令的逻辑放到 API 层。您已经提到了三个选项,如果您决定更改或添加传输,您是否愿意将您的逻辑复制粘贴到另一个 API?这就是命令服务的作用,API 层只是调用它的一种手段。
猜你喜欢
  • 2020-09-20
  • 2021-11-14
  • 1970-01-01
  • 2020-07-26
  • 2019-08-02
  • 2017-07-20
  • 1970-01-01
  • 2021-10-29
  • 2018-12-21
相关资源
最近更新 更多