我正在使用状态机工作流,并使用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应用程序,因此我试图避免直接在控制器/页面上连接事件以处理来自工作流调出的本地服务,但并不完全反对如果那是需要的方式。

最佳答案

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

基本上,我的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; }
}

关于c# - 在工作流进入完成状态之前,如何从状态机工作流中获取数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/864027/

10-11 13:57