工作流編程循序漸進(11:ASP.NET 3.5工作流編程入門)

工作流編程循序漸進11:ASP.NET 3.5工作流編程入門

作者  朱先忠  @版權所有

[注]本系列第10篇想講述關於Listen活動的應用,稍後補上。

本文中介紹一個在ASP.NET 3.5 Web應用中使用WWF的基本實例。因爲VS2008沒有提供現成的支持ASP.NET 3.5 Web應用的模板,所以相對於基本的控制檯工作流實例,實施起來略微複雜一點。因此,閱讀下文時請注意與控制檯工作流應用的區別。

一、創建ASP.NET 3.5網站

啓動VS2008,單擊菜單”文件“|”新建“|”網站“,創建一個名字爲IntroASPNET35WWF的ASP.NET 3.5網站。
因爲我們想在本例中實現根據用戶輸入人民幣數額的不同而把用戶導航到不同的頁面。所以,我們在默認頁面default.aspx中添加一些簡單的內容,如下圖所示(注意其中使用了母版頁面):

接下來,再依次添加兩個普通頁面,一個是顯示銀行存款信息的頁面credit.aspx,另一個是顯示借款信息的頁面debit.aspx。當用戶輸入金額小於100時,用戶被導航到頁面debit.aspx;否則,被導航到頁面credit.aspx

二、在示例網站中添加工作流相關程序集的引用

右單擊示例網站,選擇“添加引用”。在“添加引用”對話框中切換到”.NET“選項卡,選擇如圖所示的工作流相關程序集。最後,單擊”確定“按鈕(請注意,這幾個程序集的版本是不同的)



三、添加全局應用程序類文件Global.asax

因爲我們想控制工作流運行時的唯一實例,所以在示例中添加一個全局應用程序類文件Global.asax。右單擊示例網站,選擇“添加新項”。在“添加新項”對話框中選擇”全局應用程序類“模板添加文件Global.asax,如圖所示



接下來,打開文件Global.asax,並添加如下所示的工作流代碼
    void Application_Start(object sender, EventArgs e)
    {
        System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
                new System.Workflow.Runtime.WorkflowRuntime();

        System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService manualService =
            new System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService();
        workflowRuntime.AddService(manualService);

        workflowRuntime.StartRuntime();

        Application["WorkflowRuntime"] = workflowRuntime;       
    }
    
    void Application_End(object sender, EventArgs e)
    {
        System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
                Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
        workflowRuntime.StopRuntime();
    }

通過上述代碼,我們可以確保工作流運行時實例的唯一性。請參考後文理解這裏的代碼。

四、添加順序工作流庫

單擊菜單”文件“|”添加“|”新建項目“,添加一個命名爲WorkflowLibrary1的順序工作流庫,如圖所示。


五、設計工作流

上述步驟之後,系統自動打開工作流設計器界面。根據前面的分析,我們把一個ifElseActivity類型的活動拖動到工作流設計器中。然後,在左右兩個分支中分別拖入兩個代碼活動,最後結果如下圖所示。



選擇上圖中ifElseActivity活動的左分支,通過“屬性”對話框設定其觸發條件爲”代碼條件“,隨後輸入其條件函數名爲ValidateAmount。按下回車鍵,切換到後臺代碼文件中,輸入如下代碼:
private void ValidateAmount(object sender, ConditionalEventArgs e)
{
    if (this.Amount > 100)
        e.Result = true;
}


注意到代碼中出現一個Amount屬性,有關它的定義方式請往下閱讀。

六、定義工作流屬性

切換到工作流後臺代碼文件workflow1.cs, 右鍵單擊代碼空白處,選擇“插入代碼段”-“Other”-“Workflow”-“WorkflowDependency-Property”插入一個依賴性屬性,如下圖所示。此後,系統會把插入點自動停留在待重新確定名稱的屬性上。

在本例中,我們要創建兩個工作流屬性Amount和Result。使用類似思想創建這兩個屬性。最後得到如下所示的代碼(基本是自動化生成的,僅需要修改一個屬性名稱及typeof後面的數據類型即可):
 
public static DependencyProperty AmountProperty = DependencyProperty.Register("Amount", typeof(string), typeof(Workflow1));

[DescriptionAttribute("Amount")]
[CategoryAttribute("Amount Category")]
[BrowsableAttribute(true)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
public string Amount
{
    get
    {
        return ((string)(base.GetValue(Workflow1.AmountProperty)));
    }
    set
    {
        base.SetValue(Workflow1.AmountProperty, value);
    }
}
public static DependencyProperty ResultProperty = DependencyProperty.Register("Result", typeof(string), typeof(Workflow1));

[DescriptionAttribute("Result")]
[CategoryAttribute("Result Category")]
[BrowsableAttribute(true)]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
public string Result
{
    get
    {
        return ((string)(base.GetValue(Workflow1.ResultProperty)));
    }
    set
    {
        base.SetValue(Workflow1.ResultProperty, value);
    }
}



請注意上面兩個屬性的數據類型。      
另外,這裏定義的兩個依賴性屬性是典型的傳遞到工作流實例中的參數的方式。而且,在工作流宿主(本例中是ASP.NET網站程序)和工作流間傳遞參數的最容易的方法方式是使用字典集合,這些將在後面使用到。

七、定義代碼活動的ExecuteCode屬性值

切換到工作流設計器界面,通過屬性對話框依次把條件活動的左、右兩個分支中的代碼活動的ExecuteCode屬性函數名修改爲RedirectCredit和RedirectDebit。然後,雙擊這些函數並輸入如下所示代碼:

private void RedirectCredit(object sender, EventArgs e)
{
    this.Result = "Credit.aspx";
}
private void RedirectDebit(object sender, EventArgs e)
{
     this.Result = "Debit.aspx";
}

八、啓動工作流

雙擊示例網站中的頁面Default.aspx中的按鈕控件,並在按鈕的Click事件處理器函數中輸入如下代碼:
 
protected void Button1_Click(object sender, EventArgs e)
{
    InitiateWorkFlow();
}

然後,在代碼隱藏文件中創建具體負責初始化並啓動工作流的私有方法InitiateWorkFlow,如下所示:

private void InitiateWorkFlow()
{
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("Amount",Convert.ToInt32(TextBox1.Text));
        parameters.Add("Result", "");

        WorkflowRuntime wfRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
        wfRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(wfRuntime_WorkflowCompleted);
        WorkflowInstance wi = wfRuntime.CreateWorkflow(typeof(WorkflowLibrary2.Workflow1), parameters);
        wi.Start();
        ManualWorkflowSchedulerService ss = wfRuntime.GetService<ManualWorkflowSchedulerService>();
        ss.RunWorkflow(wi.InstanceId);
        //HttpContext.Current.Session["WorkflowID"] = wi.InstanceId;
}

上述代碼實現瞭如下功能:
  1. 根據前面的描述,我們定義的字典集合對象正是用作在工作流宿主和工作流間傳遞參數的方式。在此,我們把兩個參數(Amount和Result)添加到該集合中。
  2. 然後聲明瞭一個WorkflowRuntime對象,並把來自於網站中的工作流運行時對象(請參考前面的全局應用程序類中的application_Start事件代碼)加載於其中。
  3. 然後添加上述工作流運行時的WorkflowCompleted事件處理器函數。
  4. 然後,創建工作流實例WorkFlowInstance(請注意參數是如何傳遞到方法CreateWorkflow中的)。
  5. 啓動工作流實例。

現在,我們簡單討論一下ManualWorkflowSchedulerService。在上一節中,在 Application_Start 事件期間創建了 WorkflowRuntime 實例。 在 Web 應用程序處理請求時,會一直保留此對象。上面的代碼展示如何從 ASP.NET 中的 Application 對象中檢索 WorkflowRuntime 實例。 之後,使用 GetService 方法檢索用於啓動工作流的 ManualWorkflowSchedulerService,以便同步運行工作流。 爲此,調用在 WorkflowRuntime 類中定義的 CreateWorkflow 方法,隨後調用從 CreateWorkflow 調用中返回的 WorkflowInstance 對象中的 Start 方法。 由於將 ManualWorkflowSchedulerService 添加到了 WorkflowRuntime,因此調用 RunWorkflow 方法,傳遞WorkflowInstance 對象的 InstanceId。

接下來,我們看地下事件WorkFlowCompleted的實現代碼:
 
static void wfRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
   HttpContext.Current.Response.Redirect((string)e.OutputParameters["Result"]);  
}

在此事件方法中,請注意事件參數eventArgument 成爲WorkflowCompletedEventArgs類型。此參數有一個集合稱作Outputparametes,其中包含了工作流參數集合。因此,我們可以檢索工作流參數”Result“的值,以用於我們設計中的頁面的重定向。

九、觀察運行結果

按F5運行控制檯程序,一般順利的話,將得到如下圖所示運行時快照。
現在,輸入數字200後按下”提交“按鈕,你會被導航到如下頁面:
按下瀏覽器的後退按鈕再回到默認頁面,再輸入數字50,按下”提交“按鈕,你會被導航到如下頁面:

小結

上面給出的僅僅是一個入門級的例子,旨在探討ASP.NET 3.5環境與WWF聯合開發的基本原理。以後的文章中,我會繼續給出ASP.NET 3.5環境與WWF聯合開發的更復雜更應用的案例。

http://space.itpub.net/14466241/viewspace-615442
發佈了20 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章