【问题标题】:Having a state machine as a guard of another state machine拥有一个状态机作为另一个状态机的保护
【发布时间】:2014-06-01 22:01:00
【问题描述】:

我正在设计一个模拟组织中文档流的系统。为简单起见,我们假设流程具有以下状态:

  • 已打开
  • 已评估
  • 拒绝
  • 接受

有时需要一些外部资源才能继续。因此,如果资源不可用,则应暂停整个流程。我想还有另一个(不知何故)具有两种状态的并行状态机:

  • 进行中
  • 暂停

我认为我可以解决这个问题的方法是在第一个状态机的每次转换中检查第二个状态机的状态作为保护条件。 但我想知道是否有解决此类问题的通用方法或模式?

顺便说一句,我想使用 Statelessbbv Common(Appccelerate) 库来实现这个状态机。

【问题讨论】:

  • 考虑一个检查布尔值的守卫。该布尔值具有有限状态,可以假设由其自己的状态机驱动。因此,查询其他状态机的状态是可以接受的。不知道 Stateless 是否支持它!
  • 是的,Stateless 支持守卫,所以我可以按照你说的来实现它。

标签: c# state-machine


【解决方案1】:

使用 UML 状态机,您可以将分层状态与历史状态一起使用。

  • 进行中
    • 已打开
    • 已评估
    • 拒绝
    • 接受
    • (H) 历史状态
  • 暂停

只有在“进行中”及其子状态之一处于活动状态时,才会处理“进行中”子状态的事件。

(H) 历史状态可用于在“进行中”变为活动状态时重新激活最近活动的子状态。

【讨论】:

    【解决方案2】:

    根据我在状态机方面的经验,我认为只使用一台状态机会更好。将 On Hold 设为状态并让其他状态检查其检查条件是否所需的外部资源可用,如果不可用,则将文档移至 On Hold 状态。

    关于进行中的状态,我认为这是其他状态所暗示的,并不是真正必要的。

    由以下国家组成的国家:

    • CheckConditions,这是您放置保护条件的地方
    • 退出条件
    • 参赛条件

    【讨论】:

    • 通过这个解决方案,我应该为机器中的每个状态设置一个保持状态,因为我应该能够在它进入保持状态之前返回到相同的状态。
    • 这可能是保持状态的一个属性,用于存储前一个状态的 id。但是,如果您选择拥有两个状态机,我会理解。
    • 那我应该如何持久化我的对象的状态呢?
    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多