使用活動延伸模組
活動可以與工作流程應用程式延伸模組互動,好讓主機提供未明確在工作流程中模組化的其他功能。 本主題將說明如何建立及使用延伸模組來計算此活動所執行的次數。
若要使用活動延伸模組來計算執行次數
開啟 Visual Studio 2010。 選取 [新增]、[專案]。 選取 [Visual C#] 節點底下的 [工作流程]。 從範本清單中選取 [工作流程主控台應用程式]。 將專案命名為
Extensions
。 按一下 [確定] 以建立專案。using
在 System.Collections.Generic 命名空間的 Program.cs 檔案中新增 指示詞。using System.Collections.Generic;
在 Program.cs 檔案中,建立一個名為 ExecutionCountExtension 的新類別。 下列程式碼會建立一個工作流程延伸模組,此延伸模組會在呼叫其 Register 方法時追蹤執行個體識別碼。
// This extension collects a list of workflow Ids public class ExecutionCountExtension { IList<Guid> instances = new List<Guid>(); public int ExecutionCount { get { return this.instances.Count; } } public IEnumerable<Guid> InstanceIds { get { return this.instances; } } public void Register(Guid activityInstanceId) { if (!this.instances.Contains<Guid>(activityInstanceId)) { instances.Add(activityInstanceId); } } }
建立一個取用 ExecutionCountExtension 的活動。 下列程式碼會定義一個活動,此活動會從執行階段擷取 ExecutionCountExtension 物件,並在執行活動時呼叫其 Register 方法。
// Activity that consumes an extension provided by the host. If the extension is available // in the context, it will invoke (in this case, registers the Id of the executing workflow) public class MyActivity: CodeActivity { protected override void Execute(CodeActivityContext context) { ExecutionCountExtension ext = context.GetExtension<ExecutionCountExtension>(); if (ext != null) { ext.Register(context.WorkflowInstanceId); } } }
在 program.cs 檔案的 Main 方法中實作此活動。 下列程式碼包含的方法可產生兩個不同的工作流程、執行每一個工作流程數次,並顯示延伸模組中所包含的結果資料。
class Program { // Creates a workflow that uses the activity that consumes the extension static Activity CreateWorkflow1() { return new Sequence { Activities = { new MyActivity() } }; } // Creates a workflow that uses two instances of the activity that consumes the extension static Activity CreateWorkflow2() { return new Sequence { Activities = { new MyActivity(), new MyActivity() } }; } static void Main(string[] args) { // create the extension ExecutionCountExtension executionCountExt = new ExecutionCountExtension(); // configure the first invoker and execute 3 times WorkflowInvoker invoker = new WorkflowInvoker(CreateWorkflow1()); invoker.Extensions.Add(executionCountExt); invoker.Invoke(); invoker.Invoke(); invoker.Invoke(); // configure the second invoker and execute 2 times WorkflowInvoker invoker2 = new WorkflowInvoker(CreateWorkflow2()); invoker2.Extensions.Add(executionCountExt); invoker2.Invoke(); invoker2.Invoke(); // show the data in the extension Console.WriteLine("Executed {0} times", executionCountExt.ExecutionCount); executionCountExt.InstanceIds.ToList().ForEach(i => Console.WriteLine("...{0}", i)); } }