【发布时间】:2015-06-17 17:22:19
【问题描述】:
我正在使用 CQRS + ES,但我遇到了一个无法找到解决方案的建模问题。
您可以跳过以下内容并回答标题中的通用问题:您将在哪里查询业务逻辑所需的数据?
抱歉,原来这是一个复杂的问题,我的想法现在很扭曲!!!
问题出在:
我的用户是团队成员。这是多对多的关系。每个用户都有每个团队的可用性状态。
团队收到票,每张票都有一定的负载系数,应该根据他们的可用性和总负载分配给团队的一名成员。
第一个问题,我需要查询团队中可用的用户列表,并选择负载最少的用户,因为他有资格分配。(请注意,这是其中一种情况,它可能是运行不同的查询)
第二个问题,票的负载因子可能会改变,所以我在计算时必须考虑到这一点每个用户的总负载。请注意,虽然工单可以属于 1 个团队,但分配应基于用户的总负载,而不是每个团队的负载。
目前,此有界上下文接收到 TicketReceivedEvent,我应该触发工作流将该票分配给用户。
可能的解决方案:
- 最简单的方法是将事件排队并顺序发送命令 AssignTicketToUser 并让服务查询用户 ID 的读取模型,获取用户和 user.assignTicket(Ticket)。一旦收到 TicketAssignedEvent,就发送下一个分配命令。但是从命令处理程序中查询读取模型似乎是一个危险信号!并且很麻烦地排队购买所有这些门票!
- 为每个用户分配一个流程经理,并将其可用性/团队和分配给该用户的工单。在这种情况下,我们将查询替换为“进程管理器查找”查询,命令处理程序将调用 Ticket.AssignTo(User)。缺点是我认为太多业务逻辑泄漏到域模型之外,特别是我们从用户聚合中提取所有信息/模型以使其可用于查询
我倾向于使用第一个解决方案,它似乎更易于维护、修改/扩展和在代码中定位,但也许我缺少一些东西。
【问题讨论】:
标签: c# cqrs event-sourcing