代码之家  ›  专栏  ›  技术社区  ›  Chris Stavropoulos

在工作流进入完成状态之前,如何从状态机工作流中获取数据?

  •  2
  • Chris Stavropoulos  · 技术社区  · 15 年前

    我正在使用状态机工作流,并使用ExternalDataExchange服务处理主机中的事件,并通过EventArgs将数据获取到工作流中。

    但是,现在我需要从工作流中获取数据,我遇到了困难。

    输出参数仅在工作流完成事件中可用,但我的工作流未完成。主机用一些数据触发一个事件,并基本上等待工作流完成对事件的处理(手动调度程序)。在我对工作流中事件的特殊处理中,它正在进行一些验证,如果验证失败,它不会移动到下一个状态,但我需要能够将验证结果发送回宿主应用程序。

    我正在尝试完成的一个例子如下:

    OrderWorkflow
        PendingOrderState
            ImportOrderEvent
                - If the order passes validation move to CompletedState
                - Else return the validation results to the host (how?)
        CompletedState
    

    还应该注意的是,我的主机实际上是一个ASP.NET MVC应用程序,所以我试图避免直接在控制器/页面上连接事件来处理来自工作流调用的本地服务,但如果需要这样做,我并不完全反对它。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Chris Stavropoulos    15 年前

    看来我有一个有效的解决方案。

    基本上,我的WorkflowRuntimeManager或多或少与布鲁斯·布科维奇在他的书《Pro WF Windows Workflow in.NET 3.5》中提出的相同。

    我最终创建了一个新服务并将其添加到工作流运行时。此服务允许我的工作流在应用程序中触发一个事件,该事件允许它将任何IDictionary传递回宿主应用程序。

    此事件依次由WorkflowRuntimeManager接收,然后它依次获取结果并将其与相应的WorkflowInstance关联,并在工作流方法返回后将其提供给应用程序本身。

    我已经在这里为其他任何可能想要复制此功能的人附加了服务实现。或者更好,如果有人能找到更好的方法,请告诉我。

    public interface ISendDataService
    {
        event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent;
        void SendData(Guid instanceId, IDictionary<string, object> data);
    }
    
    public class SendDataService : ISendDataService
    {
        public event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent;
    
        private void OnReceivedDataEvent(Guid instanceId, IDictionary<string, object> data)
        {
            if (ReceivedDataEvent != null)
                ReceivedDataEvent(null, new ReceivedDataEventArgs(instanceId, data));
        }
    
        public void SendData(Guid instanceId, IDictionary<string, object> data)
        {
            OnReceivedDataEvent(instanceId, data);
        }
    }
    
    public class ReceivedDataEventArgs : EventArgs
    {
        public ReceivedDataEventArgs()
        {
        }
    
        public ReceivedDataEventArgs(Guid instanceId, IDictionary<string, object> data)
        {
            InstanceId = instanceId;
            Data = data;
        }
    
        public Guid InstanceId { get; set; }
        public IDictionary<string, object> Data { get; set; }
    }
    
        2
  •  0
  •   Nagarajan    15 年前

    以上解决方案对ManuakWorkflowScheduler服务有效-同步执行?