Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sebelum menjalankan aktivitas, runtime alur kerja mendapatkan semua informasi tentang aktivitas yang dibutuhkan untuk menjalankan eksekusinya. Runtime alur kerja mendapatkan informasi ini selama eksekusi metode CacheMetadata. Implementasi default metode ini menyediakan runtime dengan semua argumen publik, variabel, dan sub-aktivitas yang ditampilkan oleh aktivitas saat dieksekusi; jika aktivitas perlu memberikan informasi lebih lanjut kepada runtime selain itu (seperti anggota privat, atau aktivitas yang akan dijadwalkan oleh aktivitas), metode ini dapat ditimpa untuk menyediakannya.
Perilaku default CacheMetadata
Implementasi CacheMetadata default untuk aktivitas yang berasal dari NativeActivity proses jenis metode berikut dengan cara berikut:
InArgument<T>, , OutArgument<T>atau InOutArgument<T> (argumen umum): Argumen ini diekspos ke runtime sebagai argumen dengan nama dan jenis yang sama dengan nama dan jenis properti yang diekspos, arah argumen yang sesuai, dan beberapa data validasi.
Variable atau subkelas apa pun: Anggota ini diekspos ke runtime sebagai variabel publik.
Activity atau subkelas apa pun: Anggota ini diekspos ke runtime sebagai aktivitas anak publik. Perilaku default dapat diimplementasikan secara eksplisit dengan memanggil AddImportedChild, meneruskan aktivitas anak.
ActivityDelegate atau subkelas apa pun: Anggota ini diekspos ke runtime sebagai delegasi publik.
ICollection jenis Variable: Semua elemen dalam koleksi diekspos ke runtime sebagai variabel publik.
ICollection jenis Activity: Semua elemen dalam koleksi diekspos ke runtime sebagai anak publik.
ICollection jenis ActivityDelegate: Semua elemen dalam koleksi diekspos ke runtime sebagai delegasi publik.
CacheMetadata untuk aktivitas yang berasal dari Activity, , CodeActivitydan AsyncCodeActivity juga berfungsi seperti di atas, kecuali untuk perbedaan berikut:
Kelas yang berasal dari Activity tidak dapat menjadwalkan aktivitas atau delegasi anak, sehingga anggota tersebut diekspos sebagai anak impor dan delegasi;
Kelas yang berasal dari CodeActivity dan AsyncCodeActivity tidak mendukung variabel, anak, atau delegasi, sehingga hanya argumen yang akan diekspos.
Mengambil alih CacheMetadata untuk memberikan informasi ke runtime
Cuplikan kode berikut menunjukkan cara menambahkan informasi tentang anggota ke metadata aktivitas selama eksekusi CacheMetadata metode. Perhatikan bahwa dasar metode dipanggil untuk menyimpan semua data publik tentang aktivitas.
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationChild(this._writeLine);
metadata.AddVariable(this._myVariable);
metadata.AddImplementationVariable(this._myImplementationVariable);
RuntimeArgument argument = new RuntimeArgument("MyArgument", ArgumentDirection.In, typeof(SomeType));
metadata.Bind(argument, this.SomeName);
metadata.AddArgument(argument);
}
Menggunakan CacheMetadata untuk mengungkapkan komponen pelaksanaan
Untuk meneruskan data ke aktivitas anak yang akan dijadwalkan oleh aktivitas menggunakan variabel, perlu untuk menambahkan variabel sebagai variabel implementasi; variabel publik tidak boleh menetapkan nilainya dengan cara ini. Alasan untuk ini adalah bahwa aktivitas dimaksudkan untuk dijalankan lebih sebagai implementasi fungsi (yang memiliki parameter), daripada kelas yang dienkapsulasi (yang memiliki properti). Namun, ada situasi di mana argumen harus ditentukan secara eksplisit, seperti saat menggunakan ScheduleActivity, karena aktivitas terjadwal tidak memiliki akses ke argumen aktivitas induk seperti yang dimiliki oleh aktivitas anak.
Cuplikan kode berikut menunjukkan cara meneruskan argumen dari aktivitas asli ke dalam aktivitas terjadwal menggunakan CacheMetadata.
public sealed class ChildActivity : NativeActivity
{
public WriteLine _writeLine;
public InArgument<string> Message { get; set; }
private Variable<string> MessageVariable { get; set; }
public ChildActivity()
{
MessageVariable = new Variable<string>();
_writeLine = new WriteLine
{
Text = new InArgument<string>(MessageVariable),
};
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationVariable(this.MessageVariable);
metadata.AddImplementationChild(this._writeLine);
}
protected override void Execute(NativeActivityContext context)
{
string configuredMessage = context.GetValue(Message);
context.SetValue(MessageVariable, configuredMessage);
context.ScheduleActivity(this._writeLine);
}
}