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