gpt4 book ai didi

workflow - 从 XOML 动态加载工作流事件

转载 作者:行者123 更新时间:2023-12-04 07:01:27 25 4
gpt4 key购买 nike

我正在尝试实现类似于 InvokeWorkflow 的事件,它可以动态加载 XOML 文件,从中实例化事件树,并将其用作其唯一的 child 。

这将类似于 InvokeWorkflow,除了动态加载的事件被内联到主工作流中(从监控的角度来看这更好)。

我将 XamlReader 视为这样做的一种潜在方式,但显然它不适合加载工作流(仅限 UI 内容)。

谢谢,
朱利安

最佳答案

在这里实现您的目标可能非常棘手,但是让我们从简单的一点开始:-

您可以使用 WorkflowMarkupSerializer 从 XOML 重建工作流。在 System.Workflow.ComponentModel.Serialization 中找到命名空间。

var serializer = new WorkflowMarkupSerializer();
object root = serializer.Deserialize(myXmlReader);

同样,您可以使用 CompostiteActivityMarkupSerializer 重建继承自 CompositeActivity 的事件的“片段”。 .

但是,要将新的根事件集成到当前运行的工作流中需要更多的工作。您需要使用 WorkflowChanges 的实例类通过修改当前实例使用的工作流定义来创建新事件。

现在,文档在这个主题上有些粗略,甚至有点回避。不过,可以收集到两个重要的点:-
  • 最终调用 ApplyWorkflowChanges需要,该成员有 protected可访问性。
  • 文档表明这需要发生在工作流的根事件上。

  • 因此,我们可以推断出我们将需要一个自定义的根事件来至少帮助满足这一要求。

    可能有更多的方式可以构建它,但假设我们有一个 SequenceActivity其中我们有一个自定义的“InvokeWorkflow”事件来执行工作流修改,我们打算将生成的新事件放在这个包含序列的末尾。

    首先,我们需要一个可以在自定义根事件上实现的接口(interface)定义:-
    internal interface IModifiableWorkflow
    {
    void ApplyWorkflowChanges(WorkflowChanges workflowChanges);
    }

    在我们的自定义根事件中,我们将显式实现此接口(interface):-
    public class CustomSequentialActivity : SequentialWorkflowActivity, IModifiableWorkflow
    {
    void IModifiableWorkflow.ApplyWorkflowChanges(WorkflowChanges workflowChanges)
    {
    base.ApplyWorkflowChanges(workflowChanges);
    }
    }

    Execute自定义“InvokeWorkflow”事件的方法:-
    // Get root activity     
    var root = this.Parent;
    while (root.Parent != null) { root = root.Parent; }

    // Create an instance of WorkflowChanges based on the root activity
    var changes = new WorkflowChanges(root);

    //Find the parent sequence activity in the transient workflow definition
    var target = changes.TransientWorkflow.GetActivityByName(this.Parent.Name);

    Activity newActivity = YourCodeToLoadActivityDetailsFromXoml();

    target.Activities.Add(newActivity);

    //Apply the new changes
    ((IModifiableWorkflow)root).ApplyWorkflowChanges(changes);

    注意我实际上并没有测试过这些,它是从文档中隐藏的信息碎片拼凑而成的。

    关于workflow - 从 XOML 动态加载工作流事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1774258/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com