Design patterns 将大型动态变化数据集加载到表中

Design patterns 将大型动态变化数据集加载到表中,design-patterns,model-view-controller,domain-driven-design,cqrs,Design Patterns,Model View Controller,Domain Driven Design,Cqrs,我有大量的数据,偶尔会在后台更新。作为一个自学实验,我不希望依赖任何框架。现在,我正试图在DDD/CQRS上下文中找到MVC/MVVC模式的正确位置 为了填充一个表,我对一个大数据集进行查询,并将结果限制为显示行数的两倍。一旦用户滚动到查询的一半,我将查询下一批结果 当用户滚动时,我将所有结果加载到一个数组中,只是一个渐进加载,不会丢弃未显示的行 谁负责构建转换为域对象的结果数组?MVC或数据存储库的模型? 理想情况下,我希望重用我的MVC模型,而不必总是担心限制查询结果 如果在后台更新数据,则

我有大量的数据,偶尔会在后台更新。作为一个自学实验,我不希望依赖任何框架。现在,我正试图在DDD/CQRS上下文中找到MVC/MVVC模式的正确位置

为了填充一个表,我对一个大数据集进行查询,并将结果限制为显示行数的两倍。一旦用户滚动到查询的一半,我将查询下一批结果

当用户滚动时,我将所有结果加载到一个数组中,只是一个渐进加载,不会丢弃未显示的行

谁负责构建转换为域对象的结果数组?MVC或数据存储库的模型?

理想情况下,我希望重用我的MVC模型,而不必总是担心限制查询结果

如果在后台更新数据,则会创建系统事件。但是,在创建新行的情况下,我希望我的应用程序为新行的背景插入设置动画,而不仅仅是放弃查询并重新加载表。在这种情况下,我猜后台进程必须加载当前查询的副本,并将其与现有查询进行比较。它应该创建一个包含新行位置的“新行系统事件”

哪个组件应该将当前查询结果与以前的查询结果进行比较,以计算插入点和删除点?系统服务?MVC模式?


我最后关心的是,如果在后台更新数据,加载一组包含多个有限查询的行可能会不一致。如何/在何处实施此一致性?

CQRS和DDD=一个域模型和至少一个查询模型。现在,为了你自己的利益,不要认为DDD是一个有很多规则的东西,这些规则被打破了,会让你成为DDD的头号公敌

让我们想一想:一旦更新了域对象并发布了域事件,您将有一个事件处理程序来更新查询模型。哪个查询模型正是UI(视图模型)所需的查询模型

客户端UI应每隔一段时间请求更新(传递当前模型日期时间戳)。哪些更新也是查询模型的一部分。为了检测更改的内容,更新应该有一个日期时间戳,它将与当前显示的日期时间戳进行比较。如果它是一个web应用程序,那么我强烈建议使用像angularjs.org这样的js框架


现在,这个场景中的MVC模型是查询存储库。插入/编辑行时,模型将是一个服务(或命令处理程序),它将更新域。与域更改和查询模型生成相关的所有内容都在UI之外,作为服务/应用程序(可以随意称呼)层的一部分。

显示的数据在某种程度上总是过时的。为什么不让用户刷新或者让系统定期刷新呢?考虑到CQRS体系结构,如果用户请求新行,那么命令和查询都是异步事件。我认为,在这种情况下,如果您希望尽快呈现新的空行,只有系统而不是用户根据数据库更新的时间而不是用户单击新行按钮来决定何时重新加载查询。我认为客户端负责检测数据更改(通过定期扫描),否则,服务器需要广播一个DataUpdateEvent(我认为这是对网络的浪费)或保留一个客户端备忘录来决定哪个客户端对更新感兴趣(我认为这会增加很多复杂性)。嗯……StackOverflow上的注释通知功能是如何实现的?对我来说,何时更新查询是无关紧要的。更新数据库时,我已经有一个事件对象。我的问题是关于(1)我应该在哪些模式/组件中构建部分查询结果,以及(2)比较与以前的查询的差异,以设置插入或删除的动画。看看Signal,这样当数据发生变化时,您就可以将数据推送到客户端。很好!所以在MVC中,模型应该是应用程序层和域层之间的服务,对吗?我使用NoSQL数据库,每当触发mapreduce函数时,它会向我发送一条消息,因此我不需要请求更新。每当我的repo返回一系列根对象时,我都会返回一个自定义数组类,该类为我提供一些延迟加载。我现在正在考虑用一个时间戳来扩展这个类,甚至可能在我的repo中创建一个UID集……但这看起来不像我以前见过的。那会不会太疯狂了?然后,repo应该管理查询的时间:/MVC模型表示UI可用的其他层的位。MVC只存在于UI内部。用户界面应该要求更新,而不管使用的数据库是什么。另外,延迟加载(LL)的概念在这里或存储库模式中没有位置。LL是一个ORM解决方案,请放在那里。查询repo应该返回UI作为DTO所需的任何内容。查询模型的更新在UI或db外部完成。db只是保持更改,但另一个组件管理该过程。再一次,不要太担心层是如何调用的。我更愿意称之为服务,但这只是我的观点!在我的评论之后,我意识到我的CustomArray不应该有UID或时间戳,因为只有某些型号才需要它。然而,您让我想到“查询回购返回UI作为DTO所需的任何内容”。在CQRS之前,我的repos只返回根实体(List),但是由于CQRS的查询部分可以与域的实体分离,所以我添加了List。哦,这是一个完全不同的问题,我必须回顾一下我对CQRSOMG的了解!我刚刚在自己的代码中意识到,在过去,我使用CustomArray通过缓存对repo.FindByID()的内部调用来模拟对大型查询结果的调用。现在有了你的答案,我会让一些神经元工作,但我会