Bagikan melalui


Komposit Kustom menggunakan Aktivitas Asli

Sampel CustomCompositeNativeActivity menunjukkan cara menulis NativeActivity yang menjadwalkan objek Activity lain untuk mengontrol alur eksekusi alur kerja. Sampel ini menggunakan dua alur pengendalian umum, Sequence dan While, untuk mendemonstrasikan cara melakukannya.

Detail Sampel

Dimulai dengan MySequence, hal pertama yang perlu diperhatikan adalah bahwa itu berasal dari NativeActivity. NativeActivity adalah objek Activity yang mengekspos luasnya runtime alur kerja melalui NativeActivityContext yang diteruskan ke metode Execute.

MySequence mengekspos kumpulan objek Activity publik yang diisi oleh penulis alur kerja. Sebelum alur kerja dijalankan, runtime alur kerja memanggil metode CacheMetadata pada setiap aktivitas dalam alur kerja. Selama proses ini, runtime menetapkan hubungan induk-anak untuk cakupan data dan pengelolaan siklus hidup. Implementasi default metode CacheMetadatamenggunakan kelas instans TypeDescriptor untuk aktivitas MySequence guna menambahkan properti publik jenis Activity atau IEnumerable<Activity> sebagai turunan aktivitas MySequence.

Setiap kali suatu aktivitas mengekspos koleksi publik dari aktivitas anak, kemungkinan besar aktivitas anak tersebut berbagi status. Ini adalah praktik terbaik agar aktivitas induk, dalam hal ini MySequence, juga mengekspos kumpulan variabel yang memungkinkan aktivitas turunan untuk menyelesaikan tugas ini. Seperti aktivitas turunan, metode CacheMetadata menambahkan properti publik jenis Variable atau IEnumerable<Variable> sebagai variabel yang terkait dengan aktivitas MySequence.

Selain variabel publik, yang dimanipulasi oleh turunan MySequence, MySequence juga harus melacak di mana variabel berada dalam eksekusi turunannya. Ia menggunakan variabel privat, currentIndex, untuk mencapai hal ini. Variabel ini terdaftar sebagai bagian dari lingkungan MySequence dengan menambahkan panggilan ke metode AddImplementationVariable dalam metode MySequence dari aktivitas CacheMetadata. Objek Activity yang ditambahkan ke MySequenceActivities koleksi tidak dapat mengakses variabel yang ditambahkan dengan cara ini.

Ketika MySequence dijalankan oleh runtime, runtime memanggil metode Execute miliknya, lalu meneruskan NativeActivityContext. NativeActivityContext adalah proksi aktivitas ke runtime untuk mengakses argumen dan variabel, serta untuk menjadwalkan objek Activity lain, atau ActivityDelegates. MySequence menggunakan metode InternalExecute untuk merangkum logika penjadwalan anak pertama dan semua anak berikutnya dalam satu metode. Metode ini memulai dengan mendereferensiasikan currentIndex. Jika sama dengan hitungan dalam kumpulan Activities, maka urutannya selesai, dan aktivitas kembali tanpa menjadwalkan pekerjaan apa pun, serta runtime memindahkannya ke status Closed. Jika currentIndex kurang dari jumlah aktivitas, turunan berikutnya diperoleh dari koleksi Activities dan MySequence memanggil ScheduleActivity, meneruskan turunan yang akan dijadwalkan dan CompletionCallback yang menunjuk pada metode InternalExecute. Terakhir, currentIndex dinaikkan nilainya, dan kontrol diserahkan kembali ke runtime. Selama instans MySequence memiliki objek Activity turunan yang dijadwalkan, runtime menganggapnya berada dalam keadaan Menjalankan.

Ketika aktivitas turunan selesai, CompletionCallback akan dijalankan. Perulangan berlanjut dari atas. Seperti Execute, CompletionCallback mengambil NativeActivityContext dan memberikan pengimplementasi akses ke runtime.

MyWhile berbeda dari MySequence karena menjadwalkan satu objek Activity berulang kali, dan karena itu menggunakan Activity<TResult><bool> bernama Condition untuk menentukan apakah penjadwalan ini harus terjadi. Seperti MySequence, MyWhile menggunakan metode InternalExecute untuk memusatkan logika penjadwalannya. Ia menjadwalkan ConditionActivity<bool> dengan CompletionCallback<TResult><bool> bernama OnEvaluationCompleted. Ketika eksekusi Condition selesai, hasilnya tersedia melalui CompletionCallback ini dalam parameter strongly typed bernama result. Jika true, MyWhile memanggil ScheduleActivity, meneruskan objek BodyActivity dan InternalExecute sebagai CompletionCallback. Ketika eksekusi Body selesai, Condition dijadwalkan lagi di InternalExecute, sehingga memulai perulangan lagi. Ketika Condition mengembalikan false, sebuah instance dari MyWhile mengembalikan kontrol kembali ke runtime tanpa perlu menjadwalkan Body, dan runtime memindahkannya ke status Closed.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Buka solusi sampel Composite.sln di Visual Studio.

  2. Membangun dan menjalankan solusi.