Berkomunikasi antara komponen yang digabungkan secara longgar

Tip

Konten ini adalah kutipan dari eBook, Pola Aplikasi Perusahaan Menggunakan .NET MAUI, tersedia di .NET Docs atau sebagai PDF gratis yang dapat diunduh yang dapat dibaca secara offline.

Pola Aplikasi Perusahaan Menggunakan thumbnail sampul .NET MAUI eBook.

Pola terbitkan-berlangganan adalah pola olahpesan di mana penerbit mengirim pesan tanpa memiliki pengetahuan tentang penerima apa pun, yang dikenal sebagai pelanggan. Demikian pula, pelanggan mendengarkan pesan tertentu, tanpa memiliki pengetahuan tentang penerbit apa pun.

Peristiwa di .NET menerapkan pola terbitkan-berlangganan, dan merupakan pendekatan yang paling sederhana dan mudah untuk lapisan komunikasi antara komponen jika konektif longgar tidak diperlukan, seperti kontrol dan halaman yang berisinya. Namun, masa pakai penerbit dan pelanggan digabungkan oleh referensi objek satu sama lain, dan jenis pelanggan harus memiliki referensi ke jenis penerbit. Ini dapat menciptakan masalah manajemen memori, terutama ketika ada objek berumur pendek yang berlangganan peristiwa objek statis atau berumur panjang. Jika penanganan aktivitas tidak dihapus, pelanggan akan tetap hidup dengan referensi ke dalam penerbit, dan ini akan mencegah atau menunda pengumpulan sampah pelanggan.

Pengantar MessagingCenter

Kelas .NET MAUIMessagingCenter mengimplementasikan pola terbitkan-berlangganan, memungkinkan komunikasi berbasis pesan antara komponen yang tidak nyaman untuk ditautkan berdasarkan referensi objek dan jenis. Mekanisme ini memungkinkan penerbit dan pelanggan untuk berkomunikasi tanpa memiliki referensi langsung satu sama lain, membantu mengurangi dependensi antar komponen, sekaligus memungkinkan komponen dikembangkan dan diuji secara independen.

Kelas ini MessagingCenter menyediakan fungsionalitas terbitkan-berlangganan multicast. Ini berarti bahwa mungkin ada beberapa penerbit yang menerbitkan satu pesan, dan mungkin ada beberapa pelanggan yang mendengarkan pesan yang sama. Gambar di bawah ini menggambarkan hubungan ini:

Fungsionalitas multicast publish-subscribe.

Penerbit mengirim pesan menggunakan MessagingCenter.Send metode , sementara pelanggan mendengarkan pesan menggunakan MessagingCenter.Subscribe metode . Selain itu, pelanggan juga dapat berhenti berlangganan pesan, jika diperlukan, dengan MessagingCenter.Unsubscribe metode .

Secara internal, MessagingCenter kelas menggunakan referensi yang lemah. Ini berarti bahwa itu tidak akan menjaga objek tetap hidup, dan akan memungkinkan mereka untuk menjadi sampah yang dikumpulkan. Oleh karena itu, seharusnya hanya perlu berhenti berlangganan dari pesan ketika kelas tidak lagi ingin menerima pesan.

Aplikasi multi-platform eShopOnContainers menggunakan MessagingCenter kelas untuk berkomunikasi antara komponen yang digabungkan secara longgar. Aplikasi ini mendefinisikan satu pesan. Pesan AddProduct diterbitkan oleh CatalogViewModel kelas saat item ditambahkan ke kepung belanja. Sebagai gantinya CatalogView , kelas berlangganan pesan dan menggunakan ini untuk menyoroti produk yang ditambahkan dengan animasi sebagai respons.

Catatan

MessagingCenter Meskipun kelas mengizinkan komunikasi antara kelas yang digabungkan secara longgar, kelas ini tidak menawarkan satu-satunya solusi arsitektur untuk masalah ini. Misalnya, komunikasi antara model tampilan dan tampilan juga dapat dicapai oleh mesin pengikatan dan melalui pemberitahuan perubahan properti. Selain itu, komunikasi antara dua model tampilan juga dapat dicapai dengan meneruskan data selama navigasi.

Di aplikasi multi-platform eShopOnContainers, MessagingCenter digunakan untuk memperbarui di UI sebagai respons terhadap tindakan yang terjadi di kelas lain. Oleh karena itu, pesan diterbitkan di utas UI, dengan pelanggan menerima pesan pada utas yang sama.

Tip

Marsekal ke UI atau utas utama saat melakukan pembaruan UI. Jika pembaruan pada antarmuka pengguna tidak dibuat pada utas ini, itu dapat menyebabkan aplikasi crash atau menjadi tidak stabil.

Jika pesan yang dikirim dari utas latar belakang diperlukan untuk memperbarui UI, proses pesan pada utas UI di pelanggan dengan memanggil MainThread.BeginInvokeOnMainThread metode .

Untuk informasi selengkapnya tentang MessagingCenter, lihat MessagingCenter di Pusat Pengembang Microsoft.

Menentukan pesan

MessagingCenter pesan adalah string yang digunakan untuk mengidentifikasi pesan. Contoh kode berikut menunjukkan pesan yang ditentukan dalam aplikasi multi-platform eShopOnContainers:

public static class MessengerKeys
{
    // Add product to basket
    public const string AddProduct = nameof(AddProduct);
}

Dalam contoh ini, pesan didefinisikan menggunakan konstanta. Keuntungan dari pendekatan ini adalah memberikan dukungan keamanan dan pemfaktoran ulang jenis waktu kompilasi.

Menerbitkan pesan

Penerbit memberi tahu pelanggan tentang pesan dengan salah MessagingCenter.Send satu kelebihan beban. Contoh kode berikut menunjukkan penerbitan AddProduct pesan:

MessagingCenter.Send(this, MessengerKeys.AddProduct);

Dalam contoh ini, metode Kirim menentukan tiga argumen:

  • Argumen pertama menentukan kelas pengirim. Kelas pengirim harus ditentukan oleh pelanggan mana pun yang ingin menerima pesan.
  • Argumen kedua menentukan pesan.

Jika diperlukan, argumen ketiga dapat menentukan data payload yang akan dikirim ke pelanggan. Payload ini dapat berupa jenis apa pun object . Penting bahwa pelanggan pesan mengetahui jenis payload yang diharapkan.

Metode Kirim akan menerbitkan pesan, dan data payload-nya, menggunakan pendekatan fire-and-forget. Oleh karena itu, pesan dikirim meskipun tidak ada pelanggan yang terdaftar untuk menerima pesan. Dalam situasi ini, pesan terkirim diabaikan.

Catatan

Metode ini MessagingCenter.Send dapat menggunakan parameter generik untuk mengontrol bagaimana pesan dikirimkan. Oleh karena itu, beberapa pesan yang berbagi identitas pesan tetapi mengirim jenis data payload yang berbeda dapat diterima oleh pelanggan yang berbeda.

Berlangganan pesan

Pelanggan dapat mendaftar untuk menerima pesan menggunakan salah MessagingCenter.Subscribe satu kelebihan beban. Contoh kode berikut menunjukkan bagaimana aplikasi multi-platform eShopOnContainers berlangganan, dan memproses, AddProduct pesan:

MessagingCenter.Subscribe<CatalogViewModel>(
    this,
    MessengerKeys.AddProduct,
    _ =>
    {
        MainThread.BeginInvokeOnMainThread(
            async () =>
            {
                await badge.ScaleTo(1.2);
                await badge.ScaleTo(1.0);
            });
    });

Dalam contoh sebelumnya, metode Berlangganan berlangganan AddProduct pesan, dan menjalankan delegasi panggilan balik sebagai respons untuk menerima pesan. Delegasi panggilan balik ini, yang ditentukan sebagai ekspresi lambda, menjalankan kode yang memperbarui UI.

Jika data payload disediakan, jangan mencoba memodifikasi data payload dari dalam delegasi panggilan balik karena beberapa utas dapat mengakses data yang diterima secara bersamaan. Dalam skenario ini, data payload harus tidak dapat diubah untuk menghindari kesalahan konkurensi.

Pelanggan mungkin tidak perlu menangani setiap instans pesan yang diterbitkan, dan ini dapat dikontrol oleh argumen jenis generik yang ditentukan pada metode Berlangganan. Dalam contoh ini, pelanggan hanya akan menerima AddProduct pesan yang dikirim dari CatalogViewModel kelas .

Berhenti berlangganan dari pesan

Pelanggan dapat berhenti berlangganan dari pesan yang tidak ingin mereka terima lagi. Ini dicapai dengan salah MessagingCentersatu . Berhenti berlangganan kelebihan beban, seperti yang ditunjukkan dalam contoh kode berikut:

MessagingCenter.Unsubscribe<CatalogViewModel>(
    this, MessengerKeys.AddProduct);

Dalam contoh ini, sintaks metode Berhenti berlangganan mencerminkan argumen jenis yang ditentukan saat berlangganan untuk menerima pesan AddProduct.

Ringkasan

Kelas .NET MAUIMessagingCenter mengimplementasikan pola terbitkan-berlangganan, memungkinkan komunikasi berbasis pesan antara komponen yang tidak nyaman untuk ditautkan berdasarkan referensi objek dan jenis. Mekanisme ini memungkinkan penerbit dan pelanggan untuk berkomunikasi tanpa memiliki referensi satu sama lain, membantu mengurangi dependensi antar komponen, sekaligus memungkinkan komponen dikembangkan dan diuji secara independen.