【问题标题】:State Machine Frameworks for .NET.NET 的状态机框架
【发布时间】:2010-10-12 13:20:02
【问题描述】:

我的工作中有一个系统,它基本上是一个消息驱动的状态机。它接收各种类型的消息,根据消息查找一些上下文/状态,然后根据消息和当前状态决定要做什么。通常结果是一条消息被发送出系统。

有没有什么好的开源框架可以在 .NET 中实现状态机?我查看了最新版本的 Windows Workflow,它似乎是一个不错的选择;但是,我对默认的持久性机制(我们需要报告状态转换数据)、可测试性以及 WF 团队在我们所说的(假设)重新构建框架这一事实有些担忧。

我正在考虑尝试实现一个普通的 GoF“状态”模式,而不是 WF,并使用 Spring.NET 将所有内容连接在一起。有没有什么东西已经这样做了,或者类似的东西?

【问题讨论】:

标签: .net design-patterns frameworks state-machine


【解决方案1】:

根据您的具体要求,您可能会发现 State Machine Compiler 足以实现 GoF“状态”模式。它可以生成 C# 以及可以使用Graphviz 转换为多种图像格式的点。我在以前的项目中使用过它,发现它足以生成“简单”状态机。我希望这有帮助。

【讨论】:

  • 我已将 SMC 用于 C# UI 代码。它对我来说效果很好。随着时间的推移,状态模式很难维护。 SMC 的 DSL 使维护变得容易。
【解决方案2】:

两个出色的 .NET 状态机

  • Stateless - 直接在 .NET 代码中创建状态机和基于轻量级状态机的工作流
  • Automatonymous - .Net 的状态机库 - 允许您编写流畅的样式状态机

【讨论】:

  • 我用过Stateless无数次了,非常好用和扩展。我还在一些非常高负载、低延迟的应用程序中使用了它。它执行得天衣无缝。
【解决方案3】:

看看 NState

https://github.com/benaston/NState

https://nuget.org/packages/NState/

免责声明:我维护它。

【讨论】:

    【解决方案4】:

    我维护了一个开源项目,该项目实现(除其他外)一个通用的 .NET 有限状态机。它建立在QuickGraph 之上,因此您可以免费获得许多图形分析算法。请参阅this page 了解更多信息。

    【讨论】:

      【解决方案5】:

      您可以考虑North State Framework in C#。虽然它不是开源的,但它的许可相对便宜。它是我所知道的唯一允许通过状态机组合和继承重用的框架。换句话说,您可以只用几行代码从基本状态机继承,并添加状态、转换、动作等。您还可以获取现有状态机类并将其“插入”另一个状态机。相对于 GOF 或其他模式,您不会相信使用这个框架来实现和使用状态机是多么容易。

      【讨论】:

      • North State Framework 现在是开源的,具有商业和非商业用途的双重许可选项。你可以在 GitHub 上找到它。
      【解决方案6】:

      查看StateBuilderDotNet,这是一个状态机代码生成器,可将状态机的 XML 描述转换为 C# 状态模式的扩展版本。它支持所有 UML 语义:状态机可以是分层的、并发的和异步的。还可以使用图形工具来创建状态机。

      免责声明:我是这些软件的作者。

      【讨论】:

        【解决方案7】:

        我创建了Staty,这是一个用于.NET 的智能状态机。 Staty 以 C# 可移植类库 (PCL) 形式编写,是一个富有表现力的事件驱动状态机,具有

        等功能
        • 并发安全
        • 外部和内部事件
        • 每个州都有单独的类
        • 进入和退出动作和
        • 用于配置状态机的流畅语法。

        它是免费的、开源的,可在 NuGet 上获得,并基于 David Lafreniere's C++ State Machine 的想法,这是 C++ 中最著名的状态机。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2012-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多