• WF in Asp.Net


    这几天在研究Windows Workflow Foundation,天天上www.windowsworkflow.net 的论坛上查看和询问,全都是英文,头都看大了,对这金山词霸一个一个的啃。闲话少说,步入正题吧!

    本篇主要讲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();
        }

    接着,就可以在程序中运行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;
        }

    最后,运行代码后,当运行完上图中的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);


        }

    这样这个工作流就整个的执行完成了。






  • 相关阅读:
    【leetcode】1. Two Sum
    【leetcode】32. Longest Valid Parentheses
    【leetcode】20. Valid Parentheses
    scala细节
    【转】CentOS下firefox安装flash说明
    Spring 容器(一)
    源码学习快捷键
    Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案
    Insertion Sort
    Bubble Sort
  • 原文地址:https://www.cnblogs.com/maplye/p/409803.html
Copyright © 2020-2023  润新知