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

时间:2009-05-14 15:26:22

标签: c# asp.net-mvc workflow-foundation

我正在使用状态机工作流并使用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 个答案:

答案 0 :(得分:3)

看起来我有一个可行的解决方案。

基本上我的WorkflowRuntimeManager或多或少与Bruce Bukovics在其.NET 3.5 Pro WF Windows Workflow一书中提供的那个相同。

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

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

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

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; }
}

答案 1 :(得分:0)

以上解决方案适用于ManuakWorkflowScheduler服务 - 同步执行?