2013-05-14 5 views
0

Dans plusieurs de mes projets, il devient évident que j'ai besoin de quelque chose d'un peu plus puissant que les événements standard .NET. Fondamentalement, je veux l'option de dans une pompe de message, ayant des rappels (événements) élevés à des abonnés spécifiques lorsque le composant qu'ils sont intéressés change. Cela peut être un état de changement d'E/S spécifique (par exemple, un contact de fermeture de bouton) pour un projet, ou un message reçu d'un Ethernet sans fil pour une adresse MAC spécifique dans un autre.Abonnement à un événement adressé

Ma ligne de pensée actuelle est d'utiliser un dictionnaire, et la liste des délégués pour chaque adresse (pour cet exemple).

Je ne l'ai pas encore débogué mais est le suivant dans le bon sens?

class CustomSubscription 
{ 
    public delegate void DataReceivedHandler(object sender, DataReceivedEventArgs args); 

    public class DataReceivedEventArgs : EventArgs 
    { 
     public byte[] data; 
    } 

    private readonly Dictionary<int, List<DataReceivedHandler>> _subscribers; 

    public CustomSubscription() 
    { 
     _subscribers = new Dictionary<int, List<DataReceivedHandler>>(); 
    } 

    public void AddSubscriber(int address, DataReceivedHandler callback) 
    { 
     if (false == _subscribers.ContainsKey(address)) 
     { 
      _subscribers.Add(address, new List<DataReceivedHandler>()); 
     } 
     _subscribers[address].Add(callback); 
    } 

    public void RemoveSubscriber(int address, DataReceivedHandler callback) 
    { 
     if (false == _subscribers.ContainsKey(address)) 
     { 
      return; 
     } 
     if (_subscribers[address].Contains(callback)) 
     { 
      _subscribers[address].Remove(callback); 
     } 
    } 

    public void HandleIncommingData(int address, object sender, byte[] payload) 
    { 
     if (false == _subscribers.ContainsKey(address)) 
     { 
      // Nothing subscribed - take no action 
      return; 
     } 

     // Raise callbacks with all subscribers 
     foreach (DataReceivedHandler callback in _subscribers[address]) 
     { 
      callback(sender, new DataReceivedEventArgs 
           { 
            data = payload 
           }); 
     } 
    } 
} 
+1

http://wiki.unity3d.com/index.php?title=CSharpMessenger_Extended – I4V

+0

-t-il pas un abonné à restreindre par type d'événement? Je veux avoir la possibilité d'avoir plusieurs parties intéressées pour un type d'événement (que mon extrait permette) – l33tmike

+0

Non. Voir l'exemple 'Messenger .Broadcast (" vitesse changée ", vitesse);' Mot-clé ici est le 'Broadcast' – I4V

Répondre

0

On dirait que vous essayez d'implémenter un modèle d'agrégateur d'événements. Il y a déjà beaucoup d'implémentations sur le web. Vous pouvez commencer à partir d'ici, par exemple: https://stackoverflow.com/questions/2343980/event-aggregator-implementation-sample-best-practices

+0

Quelques bons exemples là-bas (et savoir ce que le nom 'officiel' aide à googler!). Le lien vers CSharpMessanger_Extended auquel I4V est lié est plus proche de ce que j'essaie de réaliser. – l33tmike

+0

@ L33tmike certainement, choisissez la mise en œuvre qui convient à vos besoins et partez-en. En revanche, en utiliser un, qui n'utilise pas de messages fortement typés, (alors qu'il dérange normalement moins de codage) peut devenir un enfer, quand il s'agit de déboguer une application volumineuse. Choisissez judicieusement :) –

+0

Oui, je vais probablement aller avec un homebrew - je n'ai pas besoin d'un agrégateur entièrement abstrait, mais j'ai adapté pour utiliser des génériques et des objets de verrouillage du code que j'ai posté à l'origine. – l33tmike

Questions connexes