Javascript 关于有界上下文及其相互作用的混淆

Javascript 关于有界上下文及其相互作用的混淆,javascript,java,architecture,domain-driven-design,bounded-contexts,Javascript,Java,Architecture,Domain Driven Design,Bounded Contexts,在阅读了Eric Evan关于域驱动设计的书之后,我正在尝试实现我的第一个域驱动应用程序。我有点搞不清楚该怎么办 在我的应用程序中,用户可以购买一项服务,让他们在Youtube发布的视频上获得一定数量的浏览量,这是由我的应用程序的其他用户完成的,他们观看这些视频基本上是许多Youtube推广应用程序的复制品,用于学习 假设该服务在应用程序中表示为一个名为WatchTime aggregate的实体。WatchTime实体包含一些信息,如购买此服务的用户id、购买的最大视图数、已完成的视图数以及观

在阅读了Eric Evan关于域驱动设计的书之后,我正在尝试实现我的第一个域驱动应用程序。我有点搞不清楚该怎么办

在我的应用程序中,用户可以购买一项服务,让他们在Youtube发布的视频上获得一定数量的浏览量,这是由我的应用程序的其他用户完成的,他们观看这些视频基本上是许多Youtube推广应用程序的复制品,用于学习

假设该服务在应用程序中表示为一个名为WatchTime aggregate的实体。WatchTime实体包含一些信息,如购买此服务的用户id、购买的最大视图数、已完成的视图数以及观看一次视频的用户所获得的分数

我决定使用3个有界上下文,一个用于身份验证,一个用于处理观察时间,比如添加或删除它们,还有一个用于管理用户及其数据。现在用户有了自己的个人信息和在使用应用程序时收集的一些信息

起初我认为所有的用户数据和相关操作都在第三个上下文中,比如给用户增加更多的分数或减少他的分数,但是在制作模型时,我意识到如果手表时间购买服务将在第二个上下文中,然后,每次购买WatchTime时,它都必须与第三个进行通信,以告知那里的服务减少购买的点数。把它们放在两个不同的地方是没有意义的

因此,我想的是在第二个有界上下文中有一个用户模型,但是只有该用户购买的点数和观察时间,所以现在它不必在第三个上下文中调用某些东西

我的问题是如何正确地将事物划分为不同的上下文?它是基于模型,还是基于功能,并且与这些功能相关的所有模型都将在相同的上下文中

还有一件事,如何确保同一实体的所有对象具有相同的值并正确地持久化到数据库中?一次是否应该只存在一个表示特定实体的对象,该对象将在函数结束时被持久化和处理?因为我在想,如果代表同一实体的两个对象同时存在,那么两个对象都有可能具有不同的值或改变为不同的值


如果我听起来像是漫无边际,请让我知道,如果我必须更清楚。谢谢。

有界上下文基本上定义了通用语言和模型相同的功能区域。在不同的有界上下文中,用户可能意味着不同的事情:在用户配置文件上下文中,您可能有他们的电子邮件地址,但在查看时间上下文中,您只需要授予积分和购买观众

另一方面,一般来说,您需要保持聚合的强一致性,并且只有当更新知道之前成功的每个更新时,才允许更新成功,包括从数据存储读取后成功的任何更新。这是单一作者原则

有几种方法可以实现这一点。首先,您可以使用乐观并发控制,并为每个聚合存储一个版本号。然后,仅当版本未更改时,才更新数据库中的聚合;否则,您将尝试对新版本的聚合执行所有验证等操作。这需要数据库中对版本和更新(例如事务)的原子检查提供一些支持

我个人偏好的另一种方法是,认识到DDD聚合与参与者计算模型具有高度的机械相似性,例如,两者都是强一致性的单位。存在actor模型的实现,例如Microsoft Orleans、Akka群集分片,允许在给定时间最多由一个actor表示聚合,即使存在多个服务器的群集