Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
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
.