CleanArch.DevKit.Messaging
1.1.1
dotnet add package CleanArch.DevKit.Messaging --version 1.1.1
NuGet\Install-Package CleanArch.DevKit.Messaging -Version 1.1.1
<PackageReference Include="CleanArch.DevKit.Messaging" Version="1.1.1" />
<PackageVersion Include="CleanArch.DevKit.Messaging" Version="1.1.1" />
<PackageReference Include="CleanArch.DevKit.Messaging" />
paket add CleanArch.DevKit.Messaging --version 1.1.1
#r "nuget: CleanArch.DevKit.Messaging, 1.1.1"
#:package CleanArch.DevKit.Messaging@1.1.1
#addin nuget:?package=CleanArch.DevKit.Messaging&version=1.1.1
#tool nuget:?package=CleanArch.DevKit.Messaging&version=1.1.1
CleanArch.DevKit.Messaging
Bus pub/sub in-process avec abonnement runtime. Pour les composants qui s'enregistrent/se désenregistrent dynamiquement (UI, view models, modules).
Rôle
IMessenger complète INotification de Mediator.Core. Les notifications du médiateur sont des handlers connus à la compilation et inscrits dans le DI — leur durée de vie est gérée par le conteneur. Les messages d'IMessenger sont au contraire abonnés au runtime : un composant s'inscrit dynamiquement (ex. au démarrage d'un view model) et se désinscrit en libérant son token IDisposable.
Deux implémentations sont fournies : Messenger (références fortes, défaut) et WeakMessenger (références faibles, plus tolérant en MVVM).
Installation
dotnet add package CleanArch.DevKit.Messaging
Aucune dépendance NuGet hors Microsoft.Extensions.DependencyInjection.Abstractions.
Fonctionnalités
- S'abonner à un type de message (
Subscribe/SubscribeAsync) - Envoyer un message (
Send/SendAsync) - Désabonner automatiquement via
IDisposable - Choisir
Messenger(références fortes) ouWeakMessenger(références faibles)
S'abonner à un message
Subscribe<TMessage> retourne un IDisposable ; conserver ce token et le disposer pour désabonner :
public sealed record UserSignedIn(string Email);
public sealed class HeaderViewModel : IDisposable
{
private readonly IDisposable _subscription;
public HeaderViewModel(IMessenger messenger)
{
_subscription = messenger.Subscribe<UserSignedIn>(OnUserSignedIn);
}
private void OnUserSignedIn(UserSignedIn evt)
{
// mettre à jour l'UI
}
public void Dispose() => _subscription.Dispose();
}
Pour un handler asynchrone :
_subscription = messenger.SubscribeAsync<UserSignedIn>(async (evt, ct) =>
{
await audit.RecordAsync(evt, ct);
});
Envoyer un message
Send est synchrone et n'invoque que les abonnés synchrones ; SendAsync invoque les abonnés sync (d'abord) puis async (séquentiellement) :
messenger.Send(new UserSignedIn("alice@example.com"));
await messenger.SendAsync(new UserSignedIn("alice@example.com"), ct);
Si aucun abonné n'est inscrit pour le type, l'appel est silencieux (pas d'exception).
Désabonner
La disposition du token retire le handler. Le pattern typique en MVVM/UI : implémenter IDisposable sur le view model et disposer dans le code-behind / le conteneur de fenêtre :
using (var vm = new HeaderViewModel(messenger))
{
messenger.Send(new UserSignedIn("alice@example.com"));
// ...
}
// vm est disposé → le handler n'est plus appelé
messenger.Send(new UserSignedIn("bob@example.com")); // pas d'effet
Choisir entre Messenger et WeakMessenger
Les deux implémentations sont enregistrées en singleton sous IMessenger — n'en utiliser qu'une seule par container :
services.AddMessenger(); // Messenger — références fortes
// OU
services.AddWeakMessenger(); // WeakMessenger — références faibles
| Implémentation | Comportement | À utiliser quand |
|---|---|---|
Messenger |
Conserve une référence forte sur le handler. Si l'abonné oublie de disposer son token, il fuite. | Tous les contextes serveur, services à durée de vie connue, code qui dispose proprement. |
WeakMessenger |
Conserve une référence faible sur l'instance qui porte la méthode. Si l'instance est collectée, l'entrée est nettoyée silencieusement. | MVVM / UI où les view models peuvent être abandonnés sans dispose explicite. |
Piège
WeakMessenger: un handler en lambda avec capture de variables (messenger.Subscribe<T>(msg => myVar.Do(...))) crée un objet closure dont seulWeakMessengerdétient une référence. Le GC peut alors le collecter et le handler arrête silencieusement de fonctionner. Pour ce cas : soit garder une référence forte sur le tokenIDisposable, soit utiliserMessengerà la place.
IMessenger vs INotification (Mediator)
| Aspect | INotification (Mediator) |
IMessenger (Messaging) |
|---|---|---|
| Inscription | Compile-time, via DI | Runtime, via Subscribe(...) |
| Durée de vie des handlers | Gérée par le DI | Gérée par le token IDisposable |
| Découverte | Générateur Roslyn | Aucune — explicite |
| Usage typique | Side-effects d'un command handler | Bus UI, communication intra-module |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.1 | 89 | 5/17/2026 |
| 1.1.0 | 84 | 5/17/2026 |
| 1.0.0 | 99 | 5/15/2026 |
| 0.1.0-preview.1 | 41 | 5/14/2026 |