Partager via


Publier et s’abonner aux messages

Le modèle de publication-abonnement est un modèle de messagerie dans lequel les éditeurs envoient des messages sans avoir connaissance des récepteurs, appelés abonnés. De même, les abonnés écoutent des messages spécifiques, sans connaître les éditeurs.

Les événements dans .NET implémentent le modèle de publication-abonnement et sont l’approche la plus simple et la plus directe pour une couche de communication entre les composants si un faible couplage n’est pas nécessaire, comme un contrôle et la page qui le contient. Toutefois, les durées de vie de l’éditeur et de l’abonné sont couplées par des références d’objet les unes aux autres, et le type d’abonné doit avoir une référence au type d’éditeur. Cela peut créer des problèmes de gestion de la mémoire, en particulier lorsqu’il existe des objets de courte durée qui s’abonnent à un événement d’un objet statique ou de longue durée. Si le gestionnaire d'événements n'est pas supprimé, l'abonné sera maintenu en vie par la référence à celui-ci dans l'émetteur, ce qui empêche ou retarde le ramasse-miettes de l'abonné.

L’interface utilisateur de l’application multiplateforme .NET (.NET MAUI) MessagingCenter classe implémente le modèle de publication-abonnement, ce qui permet une communication basée sur les messages entre les composants qui ne sont pas pratiques à lier par objet et références de type. Ce mécanisme permet aux éditeurs et aux abonnés de communiquer sans avoir de référence entre eux, ce qui permet de réduire les dépendances entre eux.

Important

MessagingCenter a été déconseillé et nous vous recommandons de le remplacer par WeakReferenceMessenger dans le package NuGet CommunityToolkit.Mvvm. Pour plus d’informations, consultez Messenger.

La classe MessagingCenter fournit des fonctionnalités de publication-abonnement multidiffusion. Cela signifie qu’il peut y avoir plusieurs éditeurs qui publient un seul message, et plusieurs abonnés peuvent écouter le même message :

fonctionnalité de publication-souscription pour la multidiffusion.

Les serveurs de publication envoient des messages à l’aide de la méthode MessagingCenter.Send, tandis que les abonnés écoutent les messages à l’aide de la méthode MessagingCenter.Subscribe. En outre, les abonnés peuvent également se désabonner des abonnements aux messages, le cas échéant, avec la méthode MessagingCenter.Unsubscribe.

Important

En interne, la classe MessagingCenter utilise des références faibles. Cela signifie qu'il ne conservera pas les objets en mémoire et permettra leur collecte des objets inutilisés. Par conséquent, il doit uniquement être nécessaire de se désabonner d’un message lorsqu’une classe ne souhaite plus recevoir le message.

Publier un message

Les messages MessagingCenter sont des chaînes. Les éditeurs informent les abonnés d’un message avec l’une des surcharges MessagingCenter.Send. L’exemple de code suivant publie un message Hi :

MessagingCenter.Send<MainPage>(this, "Hi");

Dans cet exemple, la méthode Send spécifie un argument générique qui représente l’expéditeur. Pour recevoir le message, un abonné doit également spécifier le même argument générique, indiquant qu’il écoute un message de cet expéditeur. En outre, cet exemple spécifie deux arguments de méthode :

  • Le premier argument spécifie l’instance de l’expéditeur.
  • Le deuxième argument spécifie le message.

Les données de charge utile peuvent également être envoyées avec un message :

MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

Dans cet exemple, la méthode Send spécifie deux arguments génériques. Le premier est le type qui envoie le message, et le second est le type des données de charge utile envoyées. Pour recevoir le message, un abonné doit également spécifier les mêmes arguments génériques. Cela permet à plusieurs messages qui partagent la même identité mais envoient différents types de données de charge d'être reçus par différents abonnés. En outre, cet exemple spécifie un troisième argument de méthode qui représente les données de charge utile à envoyer à l’abonné. Dans ce cas, les données de charge utile correspondent à un string.

La méthode Send publiera le message et toutes les données de charge utile à l’aide d’une approche fire-and-forget. Par conséquent, le message est envoyé même s’il n’y a pas d’abonnés inscrits pour recevoir le message. Dans ce cas, le message envoyé est ignoré.

S’abonner à un message

Les abonnés peuvent s’inscrire pour recevoir un message à l’aide de l’une des surcharges MessagingCenter.Subscribe. L’exemple de code suivant montre un exemple de ceci :

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
    // Do something whenever the "Hi" message is received
});

Dans cet exemple, la méthode Subscribe abonne l’objet this aux messages Hi envoyés par le type MainPage et exécute un délégué de rappel lors de la réception du message. Le délégué de rappel, spécifié en tant qu’expression lambda, peut être du code qui met à jour l’interface utilisateur, enregistre certaines données ou déclenche une autre opération.

Note

Un abonné n’a peut-être pas besoin de gérer chaque instance d’un message publié, et cela peut être contrôlé par les arguments de type générique spécifiés sur la méthode Subscribe.

L’exemple suivant montre comment s’abonner à un message qui contient des données de charge utile :

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

Dans cet exemple, la méthode Subscribe s’abonne aux messages Hi envoyés par le type MainPage, dont le contenu est un string. Un délégué de rappel est exécuté en réponse à la réception d’un tel message, qui affiche les données de charge utile dans une alerte.

Important

Le délégué exécuté par la méthode Subscribe est exécuté sur le même thread que celui qui publie le message à l’aide de la méthode Send.

Se désabonner d’un message

Les abonnés peuvent se désabonner des messages qu’ils ne souhaitent plus recevoir. Ceci est obtenu avec l’une des surcharges MessagingCenter.Unsubscribe :

MessagingCenter.Unsubscribe<MainPage>(this, "Hi");

Dans cet exemple, la méthode Unsubscribe désinscrit l’objet this du message Hi envoyé par le type MainPage.

Les messages contenant des données de charge utile doivent être désinscrits de l’utilisation de la surcharge Unsubscribe qui spécifie deux arguments génériques :

MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");

Dans cet exemple, la méthode Unsubscribe désabonne l’objet this du message Hi envoyé par le type MainPage, dont les données de charge utile sont un string.