2017-07-31 7 views
0

En utilisant EventAggregator avec Unity et PRISM, existe-t-il un moyen d'obtenir la liste des abonnés à un événement spécifique?EventAggregator - Obtenir la liste des abonnés

Je sais que certaines personnes diront que "Pourquoi voulez-vous le savoir, l'intérêt d'utiliser un EventAggregator est que nous ne nous soucions pas de savoir qui ou combien d'abonnés".

Ceci est purement un exercice que je veux effectuer ce n'est pas pour un but précis.

EventAggregator doit stocker une liste d'abonnés. Existe-t-il un moyen d'exposer cette liste?

Répondre

0

Oui, les informations sur l'abonné sont contenues dans le graphique d'objet EventAggregator. Malheureusement (pour votre demande), cette information est stockée dans des champs privés. Les événements sont stockés dans un code confidentiel Dictionary<Type, EventBase> events. Les abonnements sont stockés dans l'événement lui-même (en EventBase) comme

private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>(); 

Une option pour récupérer les informations d'abonnement est d'utiliser la réflexion pour accéder aux variables membres privées (en supposant l'autorisation de réflexion existe).

Si vous pouvez modifier les événements, une autre option consiste à exposer cette information via le PubSub<EventBase> spécifique puisque EventBase permet l'accès aux souscriptions pour les sous-classes via la propriété protected ICollection<IEventSubscription> Subscriptions. Par exemple:

public class MyEvent : PubSubEvent<MyEventData> 
{ 
    public new ICollection<IEventSubscription> Subscriptions => base.Subscriptions; 
} 

Ensuite, vous pouvez interroger l'événement:

var myEvent = eventAggregator.GetEvent<MyEvent>(); 
var sub = (EventSubscription<MyEventData>) myEvent.Subscriptions.FirstOrDefault(); 
MethodInfo method = sub.Action.Method; 
object target = sub.Action.Target; 

Si vous ne avez pas besoin des EventSubscription<T> données spécifiques (par exemple, veulent juste savoir compte d'abonnement), vous pouvez alors éviter la distribution spécifique et utilisez l'interface IEventSubscription.