c# - 如何持久化实现状态模式的对象?

标签 c# design-patterns software-design state-machine state-pattern

我是状态设计模式的新手,我找不到将对象的不同状态保存到数据库(在我的例子中是 SQL Server)的合适示例。该场景与以下文章中描述的示例非常相似 [几乎相同],但是我还没有找到将状态持久保存到数据库的适用解决方案。你们能推荐一个链接或举个例子吗?

State Pattern Usage and Sample in C#

此外:如何在运行时枚举所有不同的 ConcreteState 类型?例如,如果您有 10 个不同的状态,您是声明一个具有 10 个不同成员的 EnumStates 并为每个 ConcreteState 成员提供一个关联的 EnumStates 成员,还是通过获取 ConcreteState 的子类来获取所有不同的状态?

为了您的信息,我需要能够根据实体的不同状态搜索实体。

最佳答案

状态实例本身没有状态,因此您需要保存的只是每个状态的标识。将 State 类名保存在数据库中不是一个好主意,因为如果更改 State 类名,数据库将不得不更改。相反,

  • 为每个 State 类分配一个具有该州唯一的 Enum 值的成员。
  • 当您持久化具有状态的对象时,持久化枚举。

要在加载对象时取回状态,要么

  • 立即实例化对象的状态成员并将其分配给对象的状态成员,或者
  • 如果实例化 State 的成本很高,请更改对象以通过方法访问 State 成员,并根据 State 标识 Enum 成员的值在该方法中延迟实例化 State。

无论哪种方式,您都需要能够从枚举值转到状态。为此,请循环遍历所有相关的 State 类,直到找到标识值匹配的那个。

那么,相关的州有哪些?这取决于谁在编写 State 类。

  • 在简单的情况下,您控制整个程序并且程序中的所有 State 类都可能是具有 State 的对象的成员,您可以只遍历 State 父类(super class)的所有子类或实现者或界面,如下所示:Getting all types that implement an interface .

  • 如果出于某种原因您不想循环访问某些 State 类,只需在常量中定义一个您确实想要循环的列表,或者(如果您想更改它而无需更改配置中的代码)。

如果制作状态类列表很慢,只需在程序启动或首次使用时做一次。如果您对列表进行硬编码,请不要在具有状态的类(它应该独立于特定状态)或状态父类(super class)(这会引入循环依赖)中这样做;将列表放在您的程序中的较高位置(依赖性方面)或(如 Farhad 建议的那样)放在它自己的类中。

There are a lot of examples how how to persist objects with State out there ; this one相对简单。

关于c# - 如何持久化实现状态模式的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23780426/

相关文章:

c# - Razor for .Net 类库中的 .cshtml 文件

java - Pattern 避免重复处理 Block

design-patterns - 在决定产品开发的软件设计/架构时需要帮助吗?

c# - 通过引用传递 : Which is more readable/right?

c# - Unity - 从资源文件夹中读取文本文件

ios - 用于从文件创建一组对象的单独类?

c - 初始化 C 结构体与分配成员

c++ - 私有(private) getter 和 setter

c# - 内联 Eval if 语句返回常量

javascript - 切换器在 Javascript 中的实现