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);
}
}
}
}