Bagikan melalui


Menggunakan Ekstensi Aktivitas

Aktivitas dapat berinteraksi dengan ekstensi aplikasi alur kerja yang memungkinkan host menyediakan fungsionalitas tambahan yang tidak dimodelkan secara eksplisit dalam alur kerja. Topik ini menjelaskan cara membuat dan menggunakan ekstensi untuk menghitung berapa kali aktivitas dijalankan.

Untuk menggunakan ekstensi aktivitas untuk menghitung eksekusi

  1. Buka Visual Studio 2010. Pilih Baru, Proyek. Di node Visual C#, pilih Alur Kerja. Pilih Aplikasi Konsol Alur Kerja dari daftar templat. Beri nama proyek Extensions. Pilih OK untuk membuat proyek.

  2. using Tambahkan direktif dalam file Program.cs untuk namespace System.Collections.Generic.

    using System.Collections.Generic;
    
  3. Dalam file Program.cs, buat kelas baru bernama ExecutionCountExtension. Kode berikut membuat ekstensi alur kerja yang melacak ID instans saat metode Register miliknya dipanggil.

    // 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);
            }
        }
    }
    
  4. Buat aktivitas yang menggunakan ExecutionCountExtension. Kode berikut mendefinisikan aktivitas yang mengambil objek ExecutionCountExtension dari runtime bahasa umum dan memanggil metode Register miliknya saat aktivitas dijalankan.

    // 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);
            }
    
        }
    }
    
  5. Terapkan aktivitas dalam metode Utama file program.cs. Kode berikut berisi metode untuk menghasilkan dua alur kerja yang berbeda, menjalankan setiap alur kerja beberapa kali, dan menampilkan data yang dihasilkan yang dicakup dalam ekstensi.

    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));
        }
    }