我正在开发一个事件源电动汽车充电站管理系统,该系统连接多个充电站.在这个领域中,我已经为充电站提供了一个集合,它包括充电站的内部状态(无论它是否连接,它的连接器的内部状态)。
我可以向一个站点聚合发出的命令是:
UnlockConnector,发射StationConnectorUnlockedStopConnectorEnergyFlow,,发射StationConnectorEnergyFlowStopped我想出了另一个集合,它表示充电会话,用户和充电站连接器之间的交互。充电会话的创建与这些事件相耦合,即如果连接器已被用户解锁,则创建会话,如果连接器的能量流停止,则充电会话已经完成。
我添加了一个流程管理器,用于侦听事件:
StationConnectorUnlocked(stationID, connectorID) -> SessionCreated(new uuid())StationConnectorEnergyFlowStopped(stationID, connectorID) -> SessionFinished(id???)对于第一个事件,创建会话是非常直接的。但是,对于后者,它必须知道正在进行的会话的sessionID,该会话发生在Connector(connectorID) of Station(stationID)上,因此它可以更新会话。
我不能简单地实现一个GetSessionByConnectorID函数,因为我正在实现一个事件源系统,而获得会话的事件流的唯一方法是通过它的ID,而不是通过它的ConnectorID (因为我只知道会话的ConnectorID当我恢复水合物时),所以我不知道如何实现GetSessionByConnectorID函数。
因此,流程管理器有一些内部内存状态((stationID, connectorID) -> (sessionID)),以跟踪sessionID.但是,由于它是内存中的,一旦进程管理器崩溃,我就失去了(stationID, connectorID) <-> (sessionID)和ConnectorEnergyFlowStopped事件之间的关联。

我该怎么处理呢?我是否应该坚持状态?如果我坚持使用Process事件(这会很尴尬,因为它与无处不在的语言没有很好的关联,我认为SessionProcessManagerReceivedStationConnectorUnlockedEvent-尴尬级别)
编辑-新思想
我想到了另一件事,那就是移除内部Process状态,并将(stationID, connectorID) <-> (sessionID)的关联放在Station聚合的内部。不幸的是,这将意味着更高的耦合(站点必须知道什么时候创建会话,以及如何生成它的ID),但我认为它可能更简单(因为站点的事件是持久化的)。因此,空间站会发出与会话相关的事件,其中包含sessionID:
StationConnectorUnlocked(stationID, connectorID, sessionID) -> SessionCreated(sessionID)StationConnectorEnergyFlowStopped(stationID, connectorID, sessionID) -> SessionFinished(sessionID)但是,将这两件事混合起来确实有点奇怪,即使这只是会话的ID。
发布于 2020-05-16 16:12:22
我可以看到很多解决这个问题的方法,但是我不熟悉你的领域,所以我只想在这里提出一些想法:
sessionClosed事件并删除读取模型.如果可能的话,我会选第二个。最后一个将在我的列表中排在第二位,由于相关的复杂性,流程管理器将是最后的手段。
发布于 2020-05-17 03:26:11
对我来说,过程经理只是妨碍了我的到来。聚合不应该从任何地方产生,我认为您过于担心Station对Session的了解。
为什么不像session = station.unlockConnector(sessionId)那样表现出来呢?使用ARs上的工厂方法来创建新的相关ARs是非常常见的,除非会话是完全独立的BC。
此外,Session的生命周期似乎与Station密切相关。当连接器关闭时,您能提供最终的一致性吗?如果会话在连接器关闭的同时发生变异怎么办?
发布于 2020-05-17 12:57:32
我认为这个问题应该从自动售货机的角度来考虑,希望下面的答案可以帮助设计你的集合体。https://sourcemaking.com/design_patterns/state
https://stackoverflow.com/questions/61832590
复制相似问题