[workflow foundation]加入自定義的活動

[workflow foundation]加入自定義的活動

 

1. 加入一個自訂的程式碼活動

clip_image002

2. 撰寫程式並編譯

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace HelloWordWF
{

    public sealed class EmpManager : CodeActivity
    {
        // 定義字串型別的活動輸入引數
        //輸入的變數:員工姓名
        public InArgument<EmployeeDataItem> empName { get; set; }
        //輸出的變數:薪水
        public OutArgument<decimal> totalsalary { get; set; }

        // 如果您的活動要傳回值,請從 CodeActivity<TResult> 衍生該值,
        // 並從 Execute 方法傳回該值。
        protected override void Execute(CodeActivityContext context)
        {
            decimal result = new decimal(0);           
            EmployeeDataItem employees = context.GetValue<EmployeeDataItem>(empName);
            switch( employees.EmpName)
            {
                case "李阿貓": result = employees.Salary * 1;
                    break;
                case "李阿狗": result = employees.Salary * 2;
                    break;
                case "李阿牛": result = employees.Salary * 3;
                    break;
                default: break;
            }
            context.SetValue(this.totalsalary, result);
        }
    }
}

3. 可以看到工具箱多了自定義的活動

clip_image003

4. 修改在TryCatch範例中的流程,新增一個ForEach活動並修改如下

clip_image004

5. 在body拉入一個sequence及一個自定義的EmpManager活動

clip_image006

6. 增加一個變數salary定義為decimal

clip_image008

7. 修改empname的屬性

clip_image009

8. 增加一個writeline活動並設定如下

clip_image010

9. 修改完畢的ForEach活動如下

clip_image011

10. 主程式不變

using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.Collections.Generic;


namespace HelloWordWF
{

    class Program
    {
        static void Main(string[] args)
        {
           //建立引數物件EmployeeData
            EmployeeData empdata = new EmployeeData(){
                CompanyID = 123,
            };
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a1",
                EmpName = "李阿貓",
                Salary = Decimal.Parse("1000")
            });
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a2",
                EmpName = "李阿狗",
                Salary = Decimal.Parse("2000")
            });
            empdata.items.Add(new EmployeeDataItem()
            {
                EmpId = "a3",
                EmpName = "李阿牛",
                Salary = Decimal.Parse("3000")
            });
            //workflow的引數參數要用Dinctionary<,>帶入
            IDictionary<string, object> input = new Dictionary<string, object>
            {
                //注意引數名稱方向為輸入
                {"EmployeeData",empdata}
            };
            //workflow的引數參數要用Dinctionary<,>輸出
            //注意引數名稱方向為輸出
            IDictionary<string,object> output = WorkflowInvoker.Invoke(new TestForEachAndTryCatch(),input);
            Console.WriteLine("總金額為:" + ((Decimal)output["OutputData"]).ToString());
            Console.WriteLine("請按Enter鍵後離開!");
            Console.Read();
        }       
    }
   
}

11. 輸出結果

clip_image013