Api DDD请求和;活动跟踪

Api DDD请求和;活动跟踪,api,request,command,domain-driven-design,Api,Request,Command,Domain Driven Design,我有一个关于跟踪活动以及它属于哪里的问题 使用许多my domain命令,您可能还希望跟踪用户对特定上下文或对象所做的活动和修改 例如: 假设我们有一个items域/上下文,可以在其中创建和编辑项目。用户将向api发出执行此操作的请求。我们可能希望跟踪谁创建了一个项目以及对它所做的修改 在典型的CRUD模型中,您可能会在域对象/表中找到created by字段 在域对象中使用DDD进行活动时,感觉有些不对劲。活动日志感觉像是一个跨越多个边界的通用服务?让谁更改了域对象中的内容的活动日志正确吗。没

我有一个关于跟踪活动以及它属于哪里的问题

使用许多my domain命令,您可能还希望跟踪用户对特定上下文或对象所做的活动和修改

例如: 假设我们有一个items域/上下文,可以在其中创建和编辑项目。用户将向api发出执行此操作的请求。我们可能希望跟踪谁创建了一个项目以及对它所做的修改

在典型的CRUD模型中,您可能会在域对象/表中找到created by字段

在域对象中使用DDD进行活动时,感觉有些不对劲。活动日志感觉像是一个跨越多个边界的通用服务?让谁更改了域对象中的内容的活动日志正确吗。没有它,它会感觉非常干净和专注。活动日志似乎特定于应用程序案例,而不是域

因此: 活动跟踪是否应位于域对象中?
如果不应该,您如何在一个命令/请求中处理此问题。我经常听到有人说,在一个命令/请求中,您应该只触及一个边界。

我会将此活动日志视为任何其他数据。您可以将其与周围的业务逻辑结合起来。你为什么首先需要这些信息?您的
items上下文是否要实现需要活动日志的业务逻辑?如果不是,那么我会说它不属于那种情况

如果您试图使用此日志实现的是一些需要来自多个上下文的活动的数据分析,那么我会说发布业务操作中的事件(每次用户使用其中一个上下文执行操作时)并让您的活动跟踪上下文聆听它们,并以符合此目的的方式存储活动

相反,如果您的items上下文需要基于过去的活动应用某种逻辑,则将其以允许您实现此业务逻辑的格式保存在该上下文中


也有可能你实际上两者都需要。某些上下文可能只是发布事件而不存储活动,而其他上下文则会发布事件并跟踪活动以满足其自身的内部需求。

谢谢您的回答,是的,这很有意义。我的活动日志更像是一个跟踪器,而不是与项目上下文有任何关联。因此,由于项上下文在逻辑上不需要它,因此它是一个单独的上下文。但我唯一的困惑是,如果这个活动跟踪器列出了事件,它是如何获得诸如谁执行了该操作之类的信息的?e、 g.跟踪谁创建了一个项此信息是api调用的一部分,但它不会出现在发布的项的事件中,因为它可能不是其逻辑的一部分。因此,我是否将此信息作为所有上下文api/api网关中的一部分?e、 g.调用项服务上的命令以创建项,如果成功,则调用活动服务以创建有关此项和api调用方的活动日志?更简单地说,我的问题是,如果这些信息不是您试图跟踪活动的事件的一部分,那么如何获取进入Acvity日志的信息?e、 g.api调用方/创建itI的人我想你可以用很多方法来解决这个问题,但我通常的做法是为每个api调用创建一个RequestContext,其中包含有关请求的信息,其中始终包含用户ID。该上下文到处传播,因此,如果该请求最终成为在微服务中处理的命令,然后该微服务发布一个事件,则该上下文将在事件中,因此事件的接收者将有权访问发起该操作的用户的信息。但您可以在所有操作中传递用户ID,并始终将其添加到事件中。毕竟,谁进行了业务操作是一个非常相关的领域,因此将其添加到所有事件中是有意义的。