namespace Developpez.Dotnet.Windows.Service { /// /// Réprésente un handler pour un message reçu via la classe Mediator /// /// Type de message /// Objet qui a envoyé le message /// Message reçu public delegate void MediatorMessageHandler(object sender, TMessage message); /// /// Implémente un mécanisme de communication entre différentes classes d'une application MVVM. /// /// Cette classe utilise le pattern WeakEvent pour éviter les fuites mémoires dues aux objets /// non désabonnés. Un objet qui n'est plus accessible sera collecté par le garbage collector même s'il /// n'est pas désabonné d'un message. public class Mediator { /// /// Initialise une nouvelle instance de Mediator. Cette classe étant un singleton, ce /// constructeur ne peut pas être appelé directement, mais les classes dérivées peuvent /// l'appeler. /// protected Mediator() { } /// /// Permet de s'abonner à un type de message donné. /// /// Le type de message auquel on s'abonne /// Le handler qui reçoit le message public void Subscribe(MediatorMessageHandler handler) { MediatorImpl.Subscribe(handler); } /// /// Permet de se désabonner d'un type de message donné. /// /// Le type de message dont on se désabonne /// Le handler qui reçoit le message public void Unsubscribe(MediatorMessageHandler handler) { MediatorImpl.Unsubscribe(handler); } /// /// Envoie un message. /// /// Type de message à envoyer /// Object qui envoie le message /// Message à envoyer public void Post(object sender, TMessage message) { MediatorImpl.Post(sender, message); } #region Singleton implementation // Lazy and thread-safe implementation // cf. Jon Skeet's article http://www.yoda.arachsys.com/csharp/singleton.html /// /// Instance unique de la classe Mediator. /// public static Mediator Instance { get { return LazySingletonInitializer.InternalInstance; } } private static class LazySingletonInitializer { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static LazySingletonInitializer() { } internal static readonly Mediator InternalInstance = new Mediator(); } #endregion private static class MediatorImpl { // To prevent the class being marked as beforefieldinit static MediatorImpl() { } private static readonly WeakEvent> _messagePostedEvent = new WeakEvent>(); internal static void Subscribe(MediatorMessageHandler handler) { _messagePostedEvent.AddHandler(handler); } internal static void Unsubscribe(MediatorMessageHandler handler) { _messagePostedEvent.RemoveHandler(handler); } internal static void Post(object sender, TMessage message) { _messagePostedEvent.Raise(sender, message); } } } }