我一直在阅读CQRS,并发现许多原则都很有价值。但是,我有一个主要争论点。许多人谈论将读取模型查询直接映射到视图模型dtos。到现在为止还挺好。但是,“每个视图中的一个表格或一个选择”来自于我经常听到的内容?当然,有些屏幕很容易映射到1-1。但是我经常使用一些复杂的屏幕,这些屏幕会涉及多个选项,例如下拉列表,小部件等中的参考数据......
我可以很容易地看到我的观点需要多个选择,也许一些有加入或两个。
除了处理您的观点简单明了的完美世界场景之外,您怎么可能避免这种情况?
答案 0 :(得分:5)
但我经常与一些复杂的人合作 涉及多个的屏幕 选择参考数据之类的东西 在下拉列表,小部件等...
选择列表,窗口小部件等。您可以将它们视为嵌套在另一个视图中的视图(如果它们已经是它们自己的部分,则可能很明显)。当以这种方式查看时,他们每个人都可以拥有自己的查询。
答案 1 :(得分:2)
答案是一个问题:“我对我的观点进行了非正规化吗?我能否预先计算得更多?我能否更好地表示这些信息,因此需要较少的查询?”
争取“1个视图== 1个查询”。正如qstarin所述,查看!=屏幕。
答案 2 :(得分:1)
在我使用过的场景中,我们使用视图缓存作为我们希望渲染的对象的预先计算的视图。即使事件(我们使用EDA)来自不同的域,我们也有维护视图缓存的处理程序,以便我们可以在适合复合UI的状态下获取我们希望呈现的信息。我们努力的目标是让“select *”或“select * where ID =”成为对视图缓存的唯一查询形式。有些页面有多个DTO正在渲染,但我们不必加入它们。如果我们觉得需要加入,我们会在预计算阶段执行此操作,因为我们正在处理包含我们希望存储在视图缓存中的信息的消息。
答案 3 :(得分:0)
您可以使用Denormalization来避免这种情况。您应该将所有复杂数据设置为平面视图(无连接)。 另请查看First normal form (1NF or Minimal Form)。
在CQRS中,它用于使读取方尽可能快速和简单。因此,它可以水平缩放。