Nhibernate CQRS-查询端

Nhibernate CQRS-查询端,nhibernate,design-patterns,orm,command,cqrs,Nhibernate,Design Patterns,Orm,Command,Cqrs,许多关于CQRS(命令查询可重复性)分离的blogsphere文章似乎暗示所有屏幕/视图模型都是平面的。e、 g.姓名、年龄、出生地点等。。因此,建议在实现方面,我们将它们粘贴到快速读取源代码中。。每个视图一个表mySQL等。。用原始的SqlDataReader之类的东西把它们拉出来,踢那个讨厌的nhibernate ORM等等 然而,虽然我同意域模型不能很好地映射到大多数屏幕,但我使用的许多屏幕都是更具维度的,我相信这是很常见的 在LOB应用程序中 所以我的问题是,人们是如何处理屏幕的,例如,

许多关于CQRS(命令查询可重复性)分离的blogsphere文章似乎暗示所有屏幕/视图模型都是平面的。e、 g.姓名、年龄、出生地点等。。因此,建议在实现方面,我们将它们粘贴到快速读取源代码中。。每个视图一个表mySQL等。。用原始的SqlDataReader之类的东西把它们拉出来,踢那个讨厌的nhibernate ORM等等

然而,虽然我同意域模型不能很好地映射到大多数屏幕,但我使用的许多屏幕都是更具维度的,我相信这是很常见的 在LOB应用程序中

所以我的问题是,人们是如何处理屏幕的,例如,它显示客户详细信息的摘要,然后显示他们的订单列表以及[更多详细信息]链接等等

我考虑过保持对查询数据库的直接SQL查询,中断外部连接,以便可以构建一个合适的ViewModel进行查看,但这似乎有些过分了

或者(这开始让人感到不舒服)在CustomerSummaryView表中有一个text/big(无论数据库中的类型是什么)列,称为Orders,订单摘要屏幕网格的列由分隔,行由|分隔。即使使用XML数据类型,它仍然感觉脏兮兮的


有没有关于最佳实践的想法

如果有人真的说你的视图模型应该是平面的,那他们要么是在过分简化他们的例子,要么就是在胡说八道。分层数据并不坏,不应在viewmodels中避免

不过,这方面确实没有“最佳实践”。如何加载数据完全是主观的。您需要找到一个适合当前团队和系统的解决方案。您还应该了解还有哪些其他选择,因为您可能会遇到当前解决方案不足的情况

以下是我在C#/.NET中处理此问题的一些方法,具体取决于我正在使用的应用程序:

  • 数据集和Direct ADO.NET,并将数据集直接绑定到屏幕控件 **编写直接的SQL代码来加载数据集 **使用数据库中的视图加载数据集 **使用存储的进程加载数据集

  • NHibernate和DTO/Viewmodel对象 **我通常在走这条路线时使用视图——我将在我的域的模式上创建一组视图,将数据反规范化到我需要的模型中,然后使用NH通过第二组映射加载它

  • 来自域模型的DTO/Automapper **我不喜欢这种方法,除非我知道我已经在内存中加载了域模型中的所有内容。我将使用Automapper之类的工具将数据从域模型传输到DTO/ViewModel


我肯定还有其他选择,但按照我使用频率的顺序,这是我最常使用的三种选择。他们都有自己的成本/收益。但需要了解的重要一点是,您可以而且应该以一种便于填充屏幕的方式检索数据。

如果您想在视图中使用不同的维度,那么这样做没有问题。没有说明您不能在一个视图下使用多个视图模型。反规范化器负责用正确的数据填充数据库视图。看一看这篇文章,它解释了反规范化器是如何工作的,可能会让你的问题朝着正确的方向发展。

是的,出现了一个困惑。它是如何发生的:首先,为了真正帮助新手理解CQR的全部内容,并真正了解它与典型分层体系结构的区别,人们会说“您的视图模型可以是完全平坦的”,以及“您的查询数据库中每个视图模型应该有一个表”

但这真的只是为了让大家明白。。。并非每个视图模型必须只有一个表(尽管在大多数情况下可能应该)。这些声明想说的是:“你必须摆脱长期以来一直遵循的规范化规则。有了CQRS体系结构,您就有机会在查询通道中创建数据库表,这些表完全根据视图的需要而定,而不是其他任何东西。确保你充分利用这一点。不要半途而废,仅仅因为这是您习惯做的事情,就对这些表进行规范化。相反,继续做过去被认为不可想象的事情,例如为每个视图模型创建一个数据库表,或者使视图模型表完全平坦。”

仍然有像您这样的情况,最能满足您需求的模式会有多个表进行一两次连接。这很好,只要您确实设计了为视图服务的数据库表,反之亦然。但请小心,在查询数据库中的多个视图之间进行规范化和共享数据很容易滑落。不要这样做……这根本没有理由,而且成本大于效益。主要目标是这是:您的视图逻辑应该是死的、死的简单。您希望智能规则存在于房子的命令端,并在填充查询通道中数据的订阅者中有一点。因此,从查询数据库读取并在屏幕上显示数据的代码应该是死的简单(几乎与“被动视图”一样简单)

更新:作为声明不“禁止”的进一步支持“为了完成一些连接,只要您设计了数据库形状以最好地服务于您正在实现的任务,请考虑<强> OLAP .<强>星型架构是支持读取的数据库模式的完美示例,它完全适合于CQRS查询端,并且涉及连接。连接保持简单,它们的存在是为了进一步提高读取任务性能的目标