使用可视化设计器的动态更新:将流程转换为代码是否可能或更好?

Dynamic Update using the visual designer: is it possible, or better to convert flows to code?

关于我之前关于 updating long-running flows with multiple child flows and custom activities 的问题,我正在实施一个计划和代码,以便在工作流发布到生产环境后对其进行修改。

除了另一个问题中概述的各种问题外,我正在尝试调试可视化设计器在为动态更新做好准备后出现的混乱情况。在 .xaml 上出现 运行 差异之后,这似乎是 WorkflowViewState 变得混乱的问题。

根据previous posts看来,放弃视觉设计器似乎是解决这个问题的必经之路。但是,我发现代码似乎 nearly 让我到达那里。下面是我在调用 DynamicUpdateServices.PrepareForUpdate 方法后将 MainProcessFlow.xaml 保存回文件的方法:

    private static void SaveBuilderToFile(ActivityBuilder builder, string filePath)
    {
        // Make sure the activity builder has the right information about the c# expressions (even though its visual basic)
        VisualBasic.SetSettings(builder, VisualBasic.GetSettings(builder));

        // Set c# as the language
        System.Activities.Presentation.Expressions.ExpressionActivityEditor.SetExpressionActivityEditor(builder, "C#");

        // This is what I was hoping would correctly set the Viewstate
        WorkflowViewState.SetViewStateManager(
            builder.Implementation, WorkflowViewState.GetViewStateManager(builder.Implementation));

        string fullPath = Path.GetFullPath(filePath);

        using (FileStream file = File.Create(fullPath))
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(file, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }))
            {
                using (XamlWriter xamlWriter = ActivityXamlServices.CreateBuilderWriter( new XamlXmlWriter(xmlWriter, new XamlSchemaContext())))
                {
                    XamlServices.Save(xamlWriter, builder);
                }
            }
        }
    }

调用此方法并在可视化设计器中打开 .xaml 后,活动出现故障。流程仍然 "correct",因为箭头指向正确的方向,但布局混乱。在进行更改、创建更新映射并在没有动态更新信息的情况下保存 .xaml 后,顺序仍然不正确。关于在 xaml 中设置 Viewstate 的文档(我能找到的)并不多。我错过了什么吗?

或者说,放弃视觉设计师是更好的选择吗?我们有将近一年的工作流程,因此这将是一项艰巨的任务,但让 DynamicUpdate 工作是一个更高的优先级。

我刚刚解决了这个问题,我在 DynamicUpdateServices.PrepareForUpdate(builder) 之前采取 WorkflowViewState.GetViewStateManager(builder.Implementation) 来解决这个问题。我不知道是什么问题,但在我 PrepareForUpdate 之后,GetViewStateManager 的结果为空。 完成所有操作后,我将 ViewStateManager 传递给 SaveBuilderToFile() 并在那里使用它。