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

时间:2018-11-29 13:32:43

标签: domain-driven-design event-sourcing

我是Event Sourcing的新手,我正在考虑将其用于工业应用程序以跟踪生产设备中发生的事件。

由于记录簿是生产设施本身而不是系统,并且因为并非所有内容都是自动化的,所以工人将需要在给定的时间点(记录的时间)报告他们在另一个时间点的工作情况(有效时间)。因此,我将使用诸如TankFilledRecordedTankOutputConnectedToPipeInputRecordedContainerMovedToFacilityAreaRecorded等事件,其中这些事件是指诸如油箱,管道或设施区域之类的实体。这些事件将同时具有记录时间和有效时间。请注意,没有将记录视为合法的提交或批准过程。

域驱动设计(DDD)鼓励设计事件来表示域中发生的事件(如上述事件)。 但是,在我的领域中,我并不关心罐,管道或设施区域是如何形成的。我只需要知道某个特定时间点存在的东西,我还需要知道在特定时间点之后不存在的东西。该软件的主要目的是跟踪由这些管道,储罐和其他组件组成的回路中的液体和粉末流动。它不是资产管理系统,因此不应成为一个系统。

因此,设计事件以表示生产设施中存在水箱,管道或区域这一事实的正确DDD方法是什么?

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

这是我想出的:

1 EntityExistenceAcknowledgmentRecorded

TankExistenceAcknowledgmentRecorded
PipeExistenceAcknowledgmentRecorded
FacilityAreaExistenceAcknowledgmentRecorded
TankDisappearanceAcknowledgmentRecorded
PipeDisappearanceAcknowledgmentRecorded
FacilityAreaDisappearanceAcknowledgmentRecorded

以无处不在的语言使用它似乎很糟糕。我看不到自己在用这些术语说话或向用户界面提供此类词汇。但这确实表示发生了什么。

2 EntityRegistered

TankRegistered
PipeRegistered
FacilityAreaRegistered
TankUnregistered
PipeUnregistered
FacilityAreaUnregistered

这似乎简单得多,而且除了一件事之外似乎也很有意义。 “已注册”传达的是系统中存在实体的表示,具有即时效果,而现在不可能说该实体存在于2天之前。考虑一个网站中的UserRegistered事件,该事件表明该用户从10天之前“存在”。那甚至意味着什么?

事件是事实,您无法改变过去。但是,我确实需要一种让用户使他们犯错(例如错字)的记录无效的方法。现在,他们可以记录下来,他们一周前就确认了设施区的存在,并且可能比出现问题(例如实体名称中的错字)迟了才意识到。他们将使记录无效并创建一个新记录。但是,使已经“注册”的内容无效听起来不正确。

3继续寻找

尝试在域中进行更多挖掘(事件风暴),找到使实体存在的真实事件,即使这些事件在需要解决的问题中没有用。

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

1 个答案:

答案 0 :(得分:1)

注意

TankFilled
TankFilledReported
TankFilledReportSubmitted
TankFilledReportSubmissionReceived

请仔细考虑提高精度是否受到业务价值的推动。

  

因此,设计事件以表示生产设施中存在水箱,管道或区域这一事实的正确DDD方法是什么?

今天的公司在做什么?已经有一个用于跟踪工厂中硬件寿命的过程(也许是维护日志?),那里的词汇可能使您对代码中的哪些拼写有意义。 >

  

事件是事实,您无法改变过去。

是的,但是您可以追溯日期事件。信息的生效日期通常与报告的信息日期不同。

  

我确实需要一种使用户使他们犯错(例如错字)的记录无效的方法。

是-纠错是您正在建模的过程的重要组成部分。

您可能应该回顾基于Answering a Question的Greg Young的演讲this thread。这是对时间性的捕获和建模的讨论。

这是个好消息:您遇到了 right 问题。由于您正在捕获有关外部系统的信息,因此可能会出现错误和冲突,因此您需要(a)找出用于解决这些问题的协议,然后(b)对该过程进行正确建模。这可能包括系统观察到冲突的信息,补偿事件甚至自动解决冲突时生成的异常报告(对于简单的情况,另请参见Stop Over Engineering)。