本篇主要讲WF在asp.net运用。如下:
我的流程设置如下:
设置了一个CodeActive和一个HandleExternalEventActive
CodeActive是执行一段代码的Active
HandleExternalEventActive是外联一个Event的Active
首先,配置web.config
简单介绍上面的配置文件
a.注册服务
这里是将一些服务注册到 Workruntime中,你也可以在代码中使用AddServcie中注册服务。
注册好服务后,就可以在代码中
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
以上方式得到服务。
b.跟踪
配置跟踪信息,非常有用,我有一次调试的时候,MSDTC 服务没有启动的错误,就是查看WFTrace.log文件而获得的。
然后,在Global中启动一个WorkRunTime
void Application_Start(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
Application["WorkflowRuntime"] = workflowRuntime;
System.Workflow.ComponentModel.Compiler.TypeProvider typeProvider = new System.Workflow.ComponentModel.Compiler.TypeProvider(workflowRuntime);
typeProvider.AddAssembly(typeof(WorkflowLibrary1.Workflow1).Assembly);
workflowRuntime.AddService(typeProvider);
workflowRuntime.StartRuntime();
}
void Application_End(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
workflowRuntime.StopRuntime();
}
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
Application["WorkflowRuntime"] = workflowRuntime;
System.Workflow.ComponentModel.Compiler.TypeProvider typeProvider = new System.Workflow.ComponentModel.Compiler.TypeProvider(workflowRuntime);
typeProvider.AddAssembly(typeof(WorkflowLibrary1.Workflow1).Assembly);
workflowRuntime.AddService(typeProvider);
workflowRuntime.StartRuntime();
}
void Application_End(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
workflowRuntime.StopRuntime();
}
接着,就可以在程序中运行workflow了
private void StartWorkflow()
{
WorkflowRuntime workflowRuntime = StartRuntime();
// Now get a refernece to the ManualWorkflowSchedulerService
ManualWorkflowSchedulerService scheduler =
workflowRuntime.GetService<ManualWorkflowSchedulerService>();
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start();
// Now run the workflow. This is necessary when
// using the ManualWorkflowSchedulerService
scheduler.RunWorkflow(workflowInstance.InstanceId);
}
private WorkflowRuntime StartRuntime()
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
OrderLocalServices.OrderService orderService = workflowRuntime.GetService<OrderLocalServices.OrderService>();
if (orderService == null)
{
orderService = new OrderLocalServices.OrderService();
dataService.AddService(orderService);
}
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
return workflowRuntime;
}
{
WorkflowRuntime workflowRuntime = StartRuntime();
// Now get a refernece to the ManualWorkflowSchedulerService
ManualWorkflowSchedulerService scheduler =
workflowRuntime.GetService<ManualWorkflowSchedulerService>();
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start();
// Now run the workflow. This is necessary when
// using the ManualWorkflowSchedulerService
scheduler.RunWorkflow(workflowInstance.InstanceId);
}
private WorkflowRuntime StartRuntime()
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
OrderLocalServices.OrderService orderService = workflowRuntime.GetService<OrderLocalServices.OrderService>();
if (orderService == null)
{
orderService = new OrderLocalServices.OrderService();
dataService.AddService(orderService);
}
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
return workflowRuntime;
}
最后,运行代码后,当运行完上图中的CodeActive后,该workflowinstance将进入等待状态(会触发workflowRuntinme的WorkflowIdled事件)。
这个时候你如果注册了SqlWorkflowPersistenceService服务,和创建了PersistenceStore数据库,则会将此
工作流保存到数据库中,已备下次使用,关于这块下次我再整理。
为什么工作流会等待了,
因为接下来的环节HandleExternalEventActive的Active必须需要触发了和他相关联的事件后,他才会继续的。
所以,我可以针对workflowRuntinme增加WorkflowIdled事件,实现事件的代码如下:
void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"]
OrderService orderService = workflowRuntime.GetService<OrderService>();
WorkflowInstance instance = workflowRuntime.GetLoadedWorkflows()[0];
instance.Load();
//触发相关联的事件
orderService.RaiseOrderUpdatedEvent(instance.InstanceId);
}
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"]
OrderService orderService = workflowRuntime.GetService<OrderService>();
WorkflowInstance instance = workflowRuntime.GetLoadedWorkflows()[0];
instance.Load();
//触发相关联的事件
orderService.RaiseOrderUpdatedEvent(instance.InstanceId);
}
这样这个工作流就整个的执行完成了。