我使用 Windows 工作流 4 编写了一个状态机,该状态有许多状态,其中包含用于从一种状态恢复处理到另一种状态的书签。在空闲时,我想保留状态机状态并在以后(将来可能提前几周)再次启动它。
我的状态机需要在运行时提供一系列服务(接口注入),还需要一个"状态跟踪器"类的实例,该类跟踪状态机需要持久化和恢复的相关变量。状态类的属性是简单的类型,如日期、枚举和数字。
我想做的是这样的:
var store = new InMemoryPersistentStore(new StateObject() { State = "Pending", Value = 10 );
var workflowInstance = factory.ResumeFrom(store);
workflowInstance.DoSomething(); // From existing restored state.
我希望能够重新创建恢复到某种状态的工作流实例,而不必在 XML 中保留工作流的整个结构。开箱即用的持久性存储的要求非常严格,例如内部所有对象都需要可序列化,这对我来说是不切实际的。
我也读过关于StateMachineStateTracker和它的邻近类StateTrackerPersistenceProvider,它们在他们的文档中难以捉摸(这些来自其他读者的System.Activities.Extensions),但这些似乎也依赖于开箱即用的Sql Persistence存储,这似乎再次严重超重。
我似乎找不到示例来显示有关此过程或如何解决它的任何程度的细节。我已经查看了示例 MS 文档,该文档将每个实例值序列化为 XML 并再次序列化回来,但这对我来说似乎是巨大的矫枉过正(正如我所说对我来说是不可能的),并且还充满了(我认为是)版本控制问题在未来。
有没有一种方法,最好是简单的方法,我可以根据提供的注入状态类实例将我的工作流程从内存启动到状态?我已经考虑过在工作流开始时放置状态转换,以根据我的类"跳跃"到适当的初始状态,但这对我来说似乎非常不优雅且非常非状态机,我宁愿避免它。任何指示将不胜感激。
当我做类似的事情(使用常规工作流而不是状态机)时,我将工作流持久化到常规持久性存储中,而不保留注入的"状态跟踪器",然后将"状态跟踪器"保存到另一个更合适的数据库中。 稍后,您可以从存储中恢复工作流,该存储将执行点放置在存储点并重新注入"状态跟踪器"类。