问题标签 [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.
nhibernate - 使用 ORM 时如何实现命令查询分离 (CQS)?
CQS 架构模式背后的原则是将查询和命令分成不同的路径。理想情况下,您的持久性存储可以读/写分区,但在我的情况下,有一个单一的规范化数据库。
如果您使用的是 ORM(在我的例子中是 NHibernate),很明显在发出命令时使用了 ORM。但是,您需要运行所有各种查询来为用户屏幕塑造数据 (DTO),在执行 CQS 的查询端时放弃 ORM 是否普遍做法?
我应该在哪里实现我的查询和 DTO 预测?直接 ADO.NET(数据读取器、dto、数据表、存储过程)?一些查询是非常独特的,并且涉及很多连接来将所有内容组合在一起。我不想为查询对数据库进行非规范化,但我可以创建视图(穷人的非规范化)。
domain-driven-design - 如何通过内存更改实现 CQS?
看过 Greg Yound 在 DDD 上的这个视频
http://www.infoq.com/interviews/greg-young-ddd
我想知道当内存发生变化时,如何使用 DDD 实现命令查询分离 (CQS)?
使用 CQS,您有两个存储库,一个用于命令,一个用于查询。以及两个对象组,命令对象和查询对象。命令对象只有方法,没有可以暴露对象形状的属性,不能用于在屏幕上显示数据。另一方面,查询对象用于向屏幕显示数据。
在视频中,命令总是进入数据库,因此您可以使用查询存储库来获取更新的数据并重新显示在屏幕上。
您能否在 ASP.NET 中将 CQS 与类似和编辑屏幕一起使用,其中在内存中进行了更改,并且在将更改持久化到数据库之前需要多次更新屏幕?
例如
- 我从查询存储库中获取查询对象并将其显示在屏幕上
- 我点击编辑
- 我从查询对象存储库中重新获取查询对象并以编辑模式将其显示在表单上
- 我更改了表单上的一个值,该值自动回传并获取命令对象并发出相关命令
- 做什么:我现在需要在命令更改计算字段时显示更新的对象。由于命令对象尚未保存到数据库中,我无法使用查询存储库。而对于 CQS,我并不是要公开命令对象的形状以显示在屏幕上。您将如何通过更新的更改返回查询对象以显示在屏幕上。
我能想到的几个可能的解决方案是拥有一个会话存储库,或者一种从命令对象获取查询对象的方法。还是 CQS 不适用于此类场景?
在我看来,视频中的更改会直接保存到数据库中,而且我还没有找到一个使用 CQS 的 DDD 示例来解决对域对象进行批量更改和更新修改后域对象的视图的问题最后发出命令来保存域对象。
domain-driven-design - 如何在 DDD 中实现 CQRS 的查询端?
我已经使用域模型和存储库实现了 DDD 的命令端,但是如何实现查询端呢?
我是否为 UI 创建了一个全新的域模型,它保存在项目结构中的什么地方……在域层、UI 层等中?
另外,我使用什么作为我的查询机制,我是专门为 UI 域对象创建新的存储库,而不是存储库,还是其他什么?
domain-driven-design - CQRS 和 CRUD 屏幕
据我了解,CQRS 的基本原则之一是命令应该以行为为中心,并且在业务或 UL 中具有价值,而不是以数据为中心,即 CRUD。我们没有专注于更新客户,而是使用诸如 CustomerHasMoved 之类的命令。如果您有用于更正某些数据的 CRUD 屏幕怎么办。例如,我们需要更改拼写错误的客户名称。这在业务中并没有太大的价值。这应该只是在 UpdateCustomer 命令的范围内吗?
user-interface - NServicebus / CQRS:如何处理用户界面中的事情?
我一直在阅读 Udi Dahan 关于[命令查询分离和 SOA][1] 的文章。考虑到我将如何在我目前正在研究的系统中使用它,提出了一些问题......
1.
考虑以下情况,我有一个允许用户编辑条目列表的 WPF 客户端应用程序:
客户端应用程序已启动。在启动时,它订阅将处理和发布条目更改的命令服务,并查询 WCF 服务以获取完整的条目列表。接收到条目列表后,在客户端队列忙于等待 WCF 回复时可能已发布到客户端队列的任何更改(由其他客户端)都将合并到列表中。
现在对我来说,似乎有一个(可能非常小)的机会,即客户端在处理负责更改的命令之后订阅,并且 WCS 服务的查询在相同的更改提交到数据库之前启动。在这种情况下,我最终会在客户端中得到不(并且永远不会)与数据库同步的不正确数据(除非重新启动客户端应用程序)。这个问题真的存在吗,如果存在,应该如何处理?
2.我的第二个问题是关于如何设计/实现用户界面:
用户现在想要更改列表中的条目;弹出一个窗口,更改数据并按下确定按钮:我们向命令处理程序发送消息以处理此更改。用户希望看到确认(列表中的条目发生更改)或错误消息。
现在我可以尝试以“同步”的方式处理用户界面中的事情(让用户一次做一件事,让他在允许他做任何其他事情之前等待成功或失败),方式如下:
- 用户按下确定后,禁用所有控件,因此无法进行进一步编辑。
- 创建一个具有等待...的超时的 Saga?响应消息?命令服务发布的通知?两个都?
- 当收到响应消息时,列表中的数据会更改,控件会启用,我们就完成了——或者:
- 发生超时。命令消息已经排队,所以最终会执行更改,那该怎么办呢?从命令服务收到通知后,向用户显示一条消息(“这比预期花费的时间长......”),启用所有控件并更改客户端中的数据?但是如果返回错误怎么办?用户可能已经开始做其他事情(可能正在编辑另一个条目)并且从先前的编辑尝试中弹出错误消息似乎不是一个好主意。
另一种方法可能是只发送命令,让用户继续他接下来喜欢做的任何事情。也许在用户界面的某个地方的列表中显示所有未完成的命令,并带有成功或失败的指示符,以及用户在失败时显示错误消息的可能性。鉴于超时希望是异常的,并且通常应该在几秒钟内收到响应,这意味着该列表通常最多应该有 1 个未完成的命令。这一点以及我不记得我见过的事实用户界面以这种方式做事意味着它可能不是一个好主意。
你的问题是?;)
好吧,我只是想知道其他人如何在他们的用户界面中解决这个问题。与我想出的两种可能不太聪明的方法相比,在 UI 中可能有更好的处理方式吗?
对长文本表示歉意,并提前感谢您的回复。
[1]:http ://www.udidahan.com/2008/08/11/command-query-separation-and-soa/ 《命令查询分离与SOA》
domain-driven-design - CQRS 中的域查询
我们正在尝试CQRS。我们有一个验证情况,客户服务(域服务)需要知道客户是否存在。客户的电子邮件地址是独一无二的。我们的客户存储库(通用存储库)只有 Get(id) 和 Add(customer)。CustomerService 应该如何确定客户是否存在?
nhibernate - CQRS - 查询端
许多与 CQRS(命令查询响应)分离相关的 blogsphere 文章似乎暗示所有屏幕/视图模型都是平面的。例如姓名,年龄,出生地点等。因此建议我们将它们放入快速读取源等中。每个视图单个表 mySQL 等。然后使用原始 SqlDataReader 之类的东西将它们拉出来,踢那个讨厌的休眠ORM等。
然而,虽然我同意域模型不能很好地映射到大多数屏幕,但我使用的许多屏幕都更具维度,我相信这在 LOB 应用程序中很常见。
所以我的问题是人们如何处理屏幕,例如它显示客户详细信息的摘要,然后是带有 [更多详细信息] 链接等的订单列表......
我考虑过保持对查询数据库的直接 SQL 查询,断开外部连接,以便可以构建一个合适的 ViewModel 来查看,但这似乎有点矫枉过正?
或者(这开始感觉很糟糕)在 CustomerSummaryView 表中有一个名为 Orders 的文本/大(无论您的 DB 中的类型是什么)列,订单摘要屏幕网格的列由 分隔,行由 | 分隔。即使使用 XML 数据类型,它仍然感觉很脏。
关于最佳实践的任何想法?
asp.net-mvc - 如何使用 ASP.NET MVC 命令查询职责分离 (CQRS)?
我一直在阅读有关Command Query Responsibility Segregation (CQRS)的内容。我有点想知道这将如何与 ASP.NET MVC 一起使用?我从概念上理解了 CQRS 的概念,它听起来不错,并且与“正常/常见”方法相比确实引入了一些复杂性(事件和消息传递模式)。在某些方面,CQRS 的想法也有点反对使用 ORM。我试图思考如何在接下来的项目中使用这种模式,所以如果有人有将 CQRS 与 ASP.NET MVC 和 NHibernate 结合的经验,请给出一些具体的例子来帮助我更好地理解 CQRS 并与 ASP.NET MVC 一起使用。谢谢!
更新:我一直在浏览 Mark 的示例代码。如果您正在学习 CQRS,这是必读的。
http://github.com/MarkNijhof/Fohjin
http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/
http://cre8ivethought.com/blog/2009/11/28/cqrs-trying-to-make-it-re-usable/
events - CQRS 事件版本控制
版本控制
如果您的事件发生更改,您将创建该事件的新版本,并保留旧版本。为了使您的域代码表单因处理所有版本的事件而变得臃肿,您基本上会引入一个组件,将您的事件从以前的版本转换为新版本,然后将它们应用于域。请记住,事件是在您的域中实际发生的事情,因此在大多数情况下,已弃用事件中的信息很有价值。
我还没有找到任何这样的例子。
有什么帮助吗?
domain-driven-design - CQRS - 如何处理新的报告表(或:如何从事件存储中导入所有历史记录)
我研究了一些 CQRS 示例实现(Java / .Net),它们使用事件源作为事件存储,使用简单的(否)SQL 存储作为“报告存储”。
看起来一切都很好,但我似乎在所有示例实现中都遗漏了一些东西。
在应用程序投入生产后,如何处理添加新的报表存储/屏幕?以及如何将现有(最新)数据从事件存储导入到新的报表存储?
IE:
想象一个基本的 DDD/CQRS 驱动的 CRM 应用程序。每个屏幕(实际上是视图)都有自己的结构化报告存储(一个 SQL 表)。所有这些视图都使用监听域事件(CustomerCreated / CustomerHasMoved 等)的处理程序进行更新。
CRM 的一项功能是它可以记录电话呼叫(PhoneCallLogged 事件)。由于时间限制,我们仅在 CRM 的 V1 中实现了电话记录(查看和报告谁处理了哪个电话将在 V2 中实现)
在生产运行一段时间后,我们希望对每个客户和销售代表的通话记录进行“报告”。
所以我们需要添加一些屏幕(视图)和支持的报告表(在报告存储中),并用事件存储中已经收集的数据填充它......
这就是我在查看我研究的样本时遇到的问题。他们不处理将现有(历史)数据从事件存储导入(新)报告存储。
EventRepository (DomainRepository) 的所有示例只有一个方法“GetById”和“Add”,它们不支持一次获取所有聚合根以填充新报告表。
如果没有此初始数据导入,新屏幕只会针对新发生的事件进行更新。不适用于已记录的电话(因为 PhoneCallLogged 事件没有报告侦听器)
有什么建议,推荐吗?
提前致谢,
雷姆科