CQS查询 - 自动生成ADO映射到View模型?

时间:2013-06-01 10:13:05

标签: c# asp.net-mvc-4 domain-driven-design command-query-separation

我目前正在研究MVC 4应用程序。我计划实现一个命令查询分离模式,以增强性能和应用程序的结构。我很满意我的命令 - 将我的视图模型映射到我的实体使用然后使用nhibernate来保存我的数据。 命令和查询将在同一个数据库中运行。

我有点不确定管理查询的最佳方法。在我上一个项目中,我使用存储过程来处理所有读取/查询,然后使用automapper将我的IDataReaders映射到我的ViewModel。这工作正常,但主要问题是编写存储过程的转变时间以及域模型更改时存储过程不同步。

因此,理想情况下,我想从我的视图模型中自动生成视图或sprocs。但实际上,我看不到这样做的方法。因为Sprocs / Views需要一些知识可能更多的一个表。因此,仅仅反思View模型属性是不够的。 我可以为每个视图模型自动生成一个表,在开发过程中读取它,然后一旦域稳定,然后我们去测试将这些转换为视图/ sprocs?

所以我想我要问的是:

  1. 有没有人设法解决我上面描述的sproc / view自动生成问题? (这将是我最喜欢的结果!)或者甚至更好的设计了一个更优雅的解决方案!
  2. 或者仅仅在绝对必要的情况下实现原始ADO读取更为明智 - 即搜索,并且不需要大量的sprocs / views。 但是仍然将我的查询分成一个单独的通道(但其中一些使用NHibernate,而其他人使用我的ADO阅读器)。
  3. (p.s我已经查看了其他stackoverflow CQS相关问题,我希望我的不同可以保证这个问题)

1 个答案:

答案 0 :(得分:1)

存储过程为您解决了什么?为什么你不能使用NHibernate进行读取? NHibernate的查询产生的那么糟糕吗?

如果读取的性能对您至关重要,并且您的视图模型的形状与存储模型的方式非常不同 - 使非规范化过程变为视图模型太重而无法动态执行,您可能必须考虑完全拆分读写。

当你写一些东西时,你可以提出一个事件 - 通常是异步完成的 - 在哪个订阅者可以在读取端存储数据,这样它最适合读取(接近你的视图模型的形状)。这将使查询非常快。

因为一张图片说的超过千言万语。

enter image description here

您可以阅读CQRS here的详细介绍。