Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD NoSQL存储和域模型与视图模型_Domain Driven Design_Nosql_Cqrs - Fatal编程技术网

Domain driven design DDD NoSQL存储和域模型与视图模型

Domain driven design DDD NoSQL存储和域模型与视图模型,domain-driven-design,nosql,cqrs,Domain Driven Design,Nosql,Cqrs,我正在尝试使用DDD模式,作为一种持久存储,我正在考虑使用NoSQL数据库,如LiteDB、RavenDB或DocumentDB 与关系数据库相比,我的优势之一是我的域模型(整个聚合)可以序列化为JSON文档并存储在数据库中,避免了域模型到数据模型的映射 但是,为了在屏幕上显示数据,如何读取数据呢。我的UI显示基于视图模型的视图,但是如何构造它们呢?我是否通过数据库查询文档。我的域模型,然后将其映射到视图模型 我问这个问题,因为通常会提到“不要使用域模型进行查询(读取模型)” 与关系数据库相比,

我正在尝试使用DDD模式,作为一种持久存储,我正在考虑使用NoSQL数据库,如LiteDB、RavenDB或DocumentDB

与关系数据库相比,我的优势之一是我的域模型(整个聚合)可以序列化为JSON文档并存储在数据库中,避免了域模型到数据模型的映射

但是,为了在屏幕上显示数据,如何读取数据呢。我的UI显示基于视图模型的视图,但是如何构造它们呢?我是否通过数据库查询文档。我的域模型,然后将其映射到视图模型

我问这个问题,因为通常会提到“不要使用域模型进行查询(读取模型)”

与关系数据库相比,我的优势之一是我的域模型(整个聚合)可以序列化为JSON文档并存储在数据库中,避免了域模型到数据模型的映射

是的,很好

但是,为了在屏幕上显示数据,如何读取数据呢。我的UI显示基于视图模型的视图,但是如何构造它们呢?我是否通过数据库查询文档。我的域模型,然后将其映射到视图模型

对。有趣的问题是什么时候

您可以与请求同步完成该工作

您可以与请求同步执行该操作,但缓存结果,以便同一视图的后续查询更快

您可以异步完成这项工作——使用后台进程将视图加载到缓存中,以便所有查询都很快

其基本思想是,每次对文档写入更改时,都会向异步进程发出已发生更改的信号,然后该进程加载更新缓存视图所需的数据

例如,“缓存”可能是保存最近合成的视图模型的文档存储

缓存视图还可能包含元数据,允许在请求时确定是否需要重建视图。在考虑缓存元数据时,这可能是一个很好的起点


正如Pawel所指出的,将写模型和读模型分离是本文的主题。有很多可用的文献。我建议从开始。

了解域模型由行为和状态组成是很重要的。你唯一需要坚持的就是状态


当您意识到这一点时,您还将发现聚合状态并不可怕。但是,您绝对不应该使用存储库来组合读/视图模型——简单的查询就足够了。在那里,将域对象状态分离为简单的DTO(文档)变得很方便,您将这些DTO(文档)存储在数据库中,并将它们作为属性保存在域对象中。这与书中所示略有不同,但在实践中效果良好。如果您封装得足够好,并且不会编写序列化和持久性测试,那么您至少不用担心了。在由状态对象部分支持的域对象下提到它。

在应用程序服务中,使用存储库从NoSQL数据库检索聚合,然后使用一些不同的视图模型将其传递到前端。如果你正面临这样的问题,也应该考虑得到一些关于CQRS的知识。我的项目很小,它没有后端,所有的东西都在本地运行,但是我仍然想尝试在某些部件上应用DDD。我觉得CQR和异步写/读会是一种过度杀伤力。我宁愿像Paweł提到的那样,在应用程序服务中构建我的虚拟机。目前我唯一关心的是,如果我有一个包含多个属性和子集合的聚合,但我只想检索几个属性,以便在列表中显示这些数据,我该如何做?…>>…>>获取整个聚合,然后构建一个只有两个属性的VM完全是浪费。我觉得我应该总是写两个版本的文档,一个用于细节,另一个用于列表。