问题标签 [cqrs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cqrs - 准备视图模型时如何“加入”两个聚合根?
假设Book
和Author
是我模型中的聚合根。
在阅读模型中,我有一个表格AuthorsAndBooks
,它是作者和书籍的列表,由Book.AuthorId
触发事件时BookAdded
,我想接收Author
数据以创建新AuthorsAndBooks
行。
因为Book
是聚合根,事件Author
中不包含有关的信息。BookAdded
而且我不能包含它,因为Author
root 没有吸气剂(根据所有示例和有关 CQRS 和事件溯源的帖子的指南)。
通常我会在这个问题上收到两种类型的答案:
- 使用事件处理程序中所需的所有数据丰富您的域事件。但正如我所说,我不能为聚合根做到这一点。
- 使用来自 View Model 的可用数据。即从视图模型加载
Author
并使用它来构建AuthorsAndBooks
行。
最后一个在并发方面存在一些问题。BookAdded
在处理事件时,视图模型中的作者数据可能不可用。
你用什么方法来解决这个问题?谢谢你。
cqrs - 在 CQRS 架构中命名读取模型表的最佳实践?
我是 CQRS 概念的新手,并且像往常一样决定如何命名事物是学习过程中最困难的部分之一。
如果我们在 CQRS 应用程序的读取数据库中遵循每个视图 1 个表的约定,我们应该如何为不同视图命名表?
假设我们有许多不同的客户端使用读取模型,我们是否应该根据客户端和使用数据的 UI 视图来命名表?
这里不担心我们将我们的 UI 与读取模型数据库和用于执行查询的 Web 服务耦合吗?或者这正是 CQRS 架构的目的,将聚合数据的所有复杂性推入读取模型,而不是在查询 Web 服务和客户端中执行这项工作?
有人可以举一些他们在非规范化读取模型中使用的表名的例子吗?
c# - 哪种数据访问技术最适合 CQRS 查询 Web 服务?
人们使用什么工具来查询他们的读取数据库和填充 DTO?
我们目前在 Sql2008 数据库中拥有我们的读取模型,并通过 WCF 服务执行所有查询,我们正在使用 Fluent NHibernate 使用自动映射填充数据协定,但也许这只是矫枉过正?
我们的要求真的是这样...
- Webservice中没有Sql代码
- Web 服务中没有映射代码,理想情况下我们希望按照约定进行映射,读取数据库字段与我们的数据协定属性具有相同的名称。我们不想手动编写和维护映射代码。
- 网络服务器上的资源使用最少。
cqrs - 在 CQRS 内报告
我正在尝试了解 CQRS 以查看它是否可以在报告环境中提供帮助。
问题:CQRS 设计的系统已经投入生产,可以愉快地生成命令、事件并更新必要的查询视图。需要一份新的报告。该报告采用许多参数;开始日期、结束日期、产品类型和产品类别。
如何为以下各项生成聚合视图:
- 最初为空的查询存储
- 并且,可以传递具有非常不同值的参数
我是否尝试使用 CQRS 方法解决此问题,还是有更好的选择?
谢谢
cqrs - cqrs 查询性能
我想知道您何时应该考虑在查询存储中使用多个表。
例如,考虑产品描述发生变化的问题。如果您有许多包含产品描述的聚合,则此更改可能会对只读查询存储的同步产生巨大影响。
在什么时候您应该考虑对数据进行轻微的标准化以避免冗长的同步问题?这是一个禁忌还是可接受的妥协?
谢谢,
c# - 使用 Prism 事件聚合器或任何其他拦截命令的模式取消消息?
有谁知道某种方法可以取消在 Prism 事件聚合器上进一步广播消息?
我正在尝试做一些相当标准的命令/事件消息传递——让我用一个序列图来解释:
现在我想添加验证。验证应该拦截命令,确定它是否是要应用的有效命令,如果不是则取消其广播是有意义的。本质上,这就是我想要的:
有谁知道如何按照以下方式做某事
还是有另一种更好的模式可以使用?
validation - CQRS 中的验证是否必须在 UI 和业务域中分别进行一次?
我最近阅读了CQRS à la Greg Young的文章,我仍在努力了解 CQRS。
我不确定应该在哪里进行输入验证,以及是否可能必须在两个不同的位置进行(因此违反了不要重复自己的规则,也可能违反了关注点分离)。
给定以下应用程序架构:
该域隐藏在命令总线后面的 UI 中。也就是说,UI 只能向域发送命令,而不能直接访问域对象。
当聚合根对事件做出反应时,不得进行验证,但更早。
命令被转换为域中的事件(通过聚合根)。这是可能发生验证的地方:如果无法执行命令,则不会将其转换为相应的事件;相反,(例如)抛出一个异常,该异常通过命令总线向上冒泡,返回 UI,在那里它被捕获。
问题:
如果命令无法执行,我想禁用 UI 中的相应按钮或菜单项。但是我怎么知道一个命令在发送之前是否可以执行呢?查询端在这里对我没有帮助,因为它不包含任何业务逻辑;我在命令方面所能做的就是发送命令。
可能的解决方案:
对于任何命令DoX,引入一个相应的虚拟命令CanDoX,它实际上不会做任何事情,但让域反馈命令X是否可以无错误地执行。
在 UI 中复制一些验证逻辑(真正属于域)。
显然第二种解决方案是不利的(由于缺乏关注点分离)。但是第一个真的更好吗?
cqrs - 重新创建随时间变化的图表
我的域中有一个代表城市电网的实体。实际上,我的模型是一个包含断路器、变压器、线路的列表的实体。
每次断路器打开/关闭时网络都会发生变化,用户可以更改连接等......
在 CQRS 的所有示例中,使用 Version 和 aggregateId 查询 EventStore。
你认为我必须只为“网络”聚合或每个“可连接”项目实现事件吗?
在这种情况下,当我必须重播所有事件以获得“实际”状态(基于日期)时,我可以处理近 10000-20000 个事件。
一个事件修改一个属性还是我需要一个修改对象(包含对象的所有属性)的事件?
.net - 对于使用 CQRS 的 ASP.NET MVC 应用程序来说,什么是好的读取模型?
我正在寻找开发一个 ASP.NET MVC 应用程序,它应该能够在未来在 Azure 上运行。该应用程序将使用 CQRS 设计模式,我对它相当陌生。写入模型将使用 NHibernate 和映射。我不确定要为读取模型使用哪种数据库。读取模型应具有以下属性:
它不需要基于 SQL,但可以。NHibernate 也可以用于创建简单的视图模型 -> 表类型的映射,没有外键。内存数据库中的 SQL CE 或 SQLite 可用作数据提供者。在查询数据时,这也提供了更多的灵活性。
它可能只是一个对象序列化/反序列化器,它按原样存储视图模型对象。它应该使它易于使用,并且将来可以利用 Azure Blob 存储之类的东西。有没有好的框架可以很好地处理这个问题?
我很想从一些以前构建过此类应用程序的人那里得到一些反馈。
cqrs - J Oliver EventStore V2.0 问题
我正在着手实施一个使用 CQRS 的项目,并打算使用 J Oliver EventStore V2.0 作为我的事件持久性引擎。
1) 在文档中,ExampleUsage.cs 在“BuildSerializer”中使用了 3 个序列化器。我想这只是为了展示反序列化过程的灵活性?
2)在“失败后重新启动”的情况下,某些事件没有被调度,我相信我需要调用 GetUndispatchedCommits() 然后调度它们的启动代码,对吗?
3) 同样,在“ExampleUseage.cs”中,如果“TakeSnapshot”将第三个事件添加到事件存储中,然后“LoadFromSnapShotForward”不仅检索最近的快照,而且检索快照后的事件以模拟重建一个聚合体。
4) 我没有看到保留旧快照的用途。你能给出一个有用的用例吗?
5) 如果我有一个服务正在处理命令的接收和事件的生成,那么建议的策略是跟踪自给定聚合的最后一个快照以来的事件数量。我当然不想太频繁地调用“GetStreamsToSnapshot”。
6) 在 SqlPersistence.SqlDialects 命名空间中,sql 语句名称是“GetStreamsRequiringSnaphots”而不是“GetStreamsRequiringSnapShots”