我正在开发一组程序集,这些程序集封装了我们域的部分,这些部分将由许多应用程序共享。使用订单管理系统的示例,一个这样的程序集将包含应用程序可以对订单执行的所有核心操作。我们正在应用CQS / CQRS的简单版本,以便所有更改“系统”状态的操作都表示为公共命令,例如CancelOrderCommand,ShipOrderCommand和CreateORderCommand。命令处理程序是程序集内部的。
我正在努力回答的问题是如何最好地将阅读模型暴露给消费代码?
将通过使用代码来执行查询来使用读取模型。我不知道如何使用读取模型的所有方式,因此界面需要灵活允许任何查询。
使我复杂化的是,我不仅需要公开我的聚合根,而且还有一些客户端应用程序可能使用的相关数据的“查找”列表。例如,每个订单都有一个关联的OrderType,它是数据驱动的(即不是枚举),并包含几个属性,这些属性将驱动我们的一些业务规则来控制哪些操作可以/不能执行等等。很容易在我的内部模块来管理这种关系;但是,允许创建订单的客户端应用程序很可能需要向用户显示可能的OrderType列表。因此,我不仅要从我的读模型中公开Order聚合列表,还要显示OrderTypes(和其他查找列表)的支持列表。
这通常是如何完成的?
我不确定还有什么可以解释这有助于触发解决方案,所以请放弃......
答案 0 :(得分:0)
我从未见过基于CQRS的实现为ad-hoc查询公开完整的数据集,所以这是一个有趣的情况!在典型的CQRS场景中,您将公开非常具体的查询,因为您可能希望在调用事件时引发事件(例如,对于缓存 - 请参阅this post以获取更多详细信息)。
然而,由于这是您的设计,让我们不要担心“典型”或“正确”的CQRS,我想您只需要一个解决方案!我看到的灵活查询数据暴露的最佳新机制之一是Open Data Protocol (OData)。它将允许消费者对您公开的数据源实施自己的过滤,排序和分页。
大多数实现似乎都处理关系数据。如果您正在处理关系数据源,那么OData可能是一个很好的方法。我怀疑你的“暴露我的聚合根”的评论你可能正在使用文档数据库?如果是这样,我在MongoDB上看到了OData服务的一个例子:http://bloggingabout.net/blogs/vagif/archive/2012/10/11/mongodb-odata-provider-now-supports-arrays-and-nested-collections.aspx。
我希望有帮助,OData绝对值得研究。它似乎发展得非常快,并且在服务器和客户端技术平台上得到了很好的支持。