Domain driven design 如何命名一个事件,描述对事件源系统中实体存在的确认?

Domain driven design 如何命名一个事件,描述对事件源系统中实体存在的确认?,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,我是活动采购新手,我正在考虑将其用于工业应用程序,以跟踪生产设施中发生的事件 由于记录簿是生产设施本身,而不是系统,也因为并非所有东西都是自动化的,工人需要在给定的时间点报告记录的时间,他们在另一个时间点(有效时间)所做的事情。因此,我将使用事件,例如:TankFilled记录、TankOutputConnectedToPipeInputRecorded、ContainerMovedTofIlityAreaRecorded等。这些事件指的是实体,例如储罐、管道或设施区域。这些事件将同时具有记录时

我是活动采购新手,我正在考虑将其用于工业应用程序,以跟踪生产设施中发生的事件

由于记录簿是生产设施本身,而不是系统,也因为并非所有东西都是自动化的,工人需要在给定的时间点报告记录的时间,他们在另一个时间点(有效时间)所做的事情。因此,我将使用事件,例如:TankFilled记录、TankOutputConnectedToPipeInputRecorded、ContainerMovedTofIlityAreaRecorded等。这些事件指的是实体,例如储罐、管道或设施区域。这些事件将同时具有记录时间和有效时间。请注意,对于被视为合法的记录,没有提交或批准流程

域驱动设计DDD鼓励设计能够代表域中发生的事情的事件,如上述事件。 然而,在我的领域里,我并不太在乎一个储罐、一条管道或一个设施区是如何产生的。我只需要知道某个东西在某个特定的时间点存在,我还需要知道它在某个特定的时间点之后是否不存在。该软件的主要目标是跟踪由这些管道、储罐和其他部件组成的回路中流动的液体和粉末。它不是一个资产管理系统,也不应该成为一个资产管理系统

因此,正确的DDD方法是如何设计一个事件,以表示生产设施中存在储罐、管道或区域这一事实

这是一个微妙的问题,但语言很重要,尤其是在DDD中

以下是我的想法:

1实体存在每个已记录的已知片段 在无所不在的语言中使用这个似乎很糟糕。我不认为我自己在用这些术语说话,也不认为我提供了一个有这样词汇表的UI。但它确实代表了所发生的一切

2完整注册 它看起来简单多了,除了一件事之外,它似乎也很有意义。“已注册”表示一个实体在系统中的代表存在并立即生效,而不可能现在说该实体存在于2天前。想想在一个网站上发生的一个UserRegistered事件,它表明该用户在10天前“存在”。那意味着什么

事件是事实,你无法改变过去。但是,我确实需要一种方法,让我的用户能够使他们犯了错误(例如打字错误)的记录无效。他们现在可以记录,他们在一周前承认存在一个设施区,并可能在一周后意识到有问题,例如实体名称中的拼写错误。他们将使记录失效并创建一个新记录。但是,使已经“注册”的东西无效听起来并不正确

3继续找 尝试在领域事件风暴中挖掘更多信息,并找到导致实体存在的真实事件,即使这些事件在需要解决的问题中毫无用处

TankBuiltRecorded
PipeBuiltRecorded, PipeDeliveredRecorded
FacilityArea<something_meaningful>Recorded
TankDestroyedRecorded, TankDecommissionedRecorded
PipeDecommissionedRecorded
FacilityArea<something_meaningful>Recorded
警告

TankFilled
TankFilledReported
TankFilledReportSubmitted
TankFilledReportSubmissionReceived
仔细考虑提高的精度是否是由业务价值驱动的

因此,正确的DDD方法是如何设计一个事件,以表示生产设施中存在储罐、管道或区域这一事实

今天做什么生意?是否已经有一个跟踪工厂硬件寿命的流程,或者是维护日志?这个地方可能有一些词汇,让你知道什么拼写在代码中是有意义的

事件是事实,你无法改变过去

没错,但你可以追溯事件的发生日期。信息的生效日期通常与报告的信息日期不同

我确实需要一种方法,让我的用户能够使他们犯了错误(如打字错误)的记录无效

是-错误纠正是建模过程中的一个重要部分

你可能应该回顾一下格雷格·杨的演讲,这是基于。这是对时间性的捕捉和建模的讨论


好消息是:你遇到了正确的问题。由于您正在捕获有关外部系统的信息,因此可能会出现错误和冲突,您需要找出解决这些问题的协议,然后建立正确的流程模型。这可能包括系统观察到冲突信息时生成的异常报告,或补偿事件,甚至是简单案例的自动冲突解决-另请参见。

谢谢。读了你的答案后,我在问题中添加了一些细节。此外,如果这有帮助的话,我们没有系统或流程来管理硬件的生命周期。+1今天的业务是什么。。。那个地方可能有词汇。考虑一下 通用语言的扩展,它将帮助您将代码绑定到域。
TankBuiltRecorded
PipeBuiltRecorded, PipeDeliveredRecorded
FacilityArea<something_meaningful>Recorded
TankDestroyedRecorded, TankDecommissionedRecorded
PipeDecommissionedRecorded
FacilityArea<something_meaningful>Recorded
TankFilled
TankFilledReported
TankFilledReportSubmitted
TankFilledReportSubmissionReceived