c# - CQRS + ES - 在哪里查询业务逻辑所需的数据?

标签 c# cqrs event-sourcing

我正在使用 CQRS + ES,但我有一个找不到解决方案的建模问题。
您可以跳过下面的内容并回答标题中的通用问题:您将在哪里查询业务逻辑所需的数据?
不好意思原来是个复杂的问题,我现在脑子有问题!!!
问题是:
我的用户是团队成员。这是多对多的关系。每个用户在每个团队中都有一个可用性状态。
团队收到票证,每张票证都有一定的负载系数,应根据他们的可用性和总负载将其分配给团队的一名成员。
第一个问题,我需要查询团队中可用的用户列表,并选择负载最少的用户,因为他符合分配条件。(请注意,这是其中一个在这种情况下,可能需要运行不同的查询)
第二个问题,工单的负载系数可能会发生变化,因此我在计算每个用户的总负载时必须考虑到这一点。请注意,虽然工单可以属于 1 个团队,但分配应基于用户总负载而不是他在每个团队的负载。
目前,此限界上下文收到了一个 TicketReceivedEvent,我应该触发一个工作流来将该票分配给用户。
可能的解决方案:

  1. 最简单的方法是将事件排队并按顺序发送命令 AssignTicketToUser 并让服务查询用户 ID 的读取模型,获取用户和 user.assignTicket(Ticket)。收到 TicketAssignedEvent 后,发送下一个分配命令。但是从命令处理程序中查询读取模型似乎是一个危险信号!以及排队所有这些门票的麻烦!
  2. 为每个用户配备一名流程经理,并为该用户分配他的可用性/团队和工单。在那种情况下,我们用“进程管理器查找”查询替换对读取端的查询,命令处理程序将调用 Ticket.AssignTo(User)。缺点是我认为太多的业务逻辑泄漏到域模型之外,特别是我们从用户聚合中提取所有信息/模型以使其可用于查询

我倾向于使用第一种解决方案,它似乎更易于维护、修改/扩展和在代码中定位,但也许我缺少某些东西。

最佳答案

总是(嗯,99.99% 的情况)在业务/领域层,即在 CQRS 的“命令”部分。这意味着您的存储库应该具有用于​​特定查询的方法,并且您的持久性模型应该足够“可查询”以用于此目的。这意味着在决定如何实现持久性之前,您必须更多地了解域的用例。

使用文档数据库(mongodb、raven 数据库或 postgres)可能会使工作更轻松。如果您坚持使用 rdbms 或键值存储,请创建查询表,即写入模型的读取模型,充当索引 :)(假设您正在序列化对象)。如果您为每个实体类型存储与特定表架构相关的内容(巨大的开销,您会使您的生活复杂化),那么信息很容易自动查询。

关于c# - CQRS + ES - 在哪里查询业务逻辑所需的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30898294/

相关文章:

domain-driven-design - 加载聚合对域事件的 react

c# - ReSharper 单元测试运行程序对外部类给出不确定性

CQRS/事件溯源 : How to enforce data-integrity?

php - CQRS 中的反规范化/投影数据

没有事件溯源的 CQRS - 有哪些缺点?

domain-driven-design - 域事件应该有多细化?

c# - C#:专注于WPF文本框的工具提示

c# - ASP.NET MVC 货币/文化问题

c# - 如何将通过反射获得的方法分配给委托(delegate)? (或 : how to speed up method calls through reflection)

proxy - 如何将命令、查询和事件转发到另一个 Axon 实例