/// <summary> /// Constructeur /// </summary> /// <param name="callback">callback à invoquer</param> /// <param name="filter">filtre permettant de savoir si le callback doit être invoqué</param> /// <param name="threadingStrategy">stratégie de threading d'exécution du callback</param> /// <param name="throwOnce">Si définie à <c>true</c>, l'invocation du callback n'est réalisée qu'une fois.</param> /// <param name="target">La cible de de l'abonnement.</param> public Subscription(Delegate callback, Delegate filter, ThreadingStrategy threadingStrategy, bool throwOnce, object target) { if (callback == null) { throw new ArgumentNullException("callback"); } _callback = new WeakDelegate(callback, target); if (filter != null) { _filter = new WeakDelegate(filter, target); } _threadingStrategy = threadingStrategy; _throwOnce = throwOnce; }
/// <summary> /// S'abonne à un événement publié sur le bus /// </summary> /// <typeparam name="TEvent">type d'événement pour lequel l'abonnement est fait</typeparam> /// <param name="callback">handler utilisé lors de la levée de l'événement</param> /// <param name="filter">filtre permettant de savoir si le handler doit être exécuté ou non</param> /// <param name="strategy">stratégie de threading lors de l'exécution du callback</param> /// <param name="throwOnce">indique si l'abonnement est maintenu ou non après le premier déclenchement</param> /// <param name="target">cible de l'abonnement</param> /// <returns>l'instance du bus pour une écriture fluide</returns> /// <remarks>Attention en cas d'utilisation de lambda à ce que ce ne soit pas un champs statique (=> la lambda doit faire référence à la classe qui la contient</remarks> public IEventBus Subscribe <TEvent>(Action <TEvent> callback, Predicate <TEvent> filter, ThreadingStrategy strategy, bool throwOnce = false, object target = null) where TEvent : EventBase { if (callback == null) { throw new ArgumentNullException("callback"); } if (target == null && callback.Target == null) { throw new ArgumentException("Callback's target must have a reference, it cannot be a static method unless a target is provided", "callback"); } lock (_subscribees) { Type eventType = typeof(TEvent); if (!_subscribees.ContainsKey(eventType)) { _subscribees[eventType] = new List <Subscription>(1); } _subscribees[eventType].Add(new Subscription(callback, filter, strategy, throwOnce, target ?? callback.Target)); } return(this); }
/// <summary> /// S'abonne à un événement publié sur le bus /// </summary> /// <typeparam name="TEvent">type d'événement pour lequel l'abonnement est fait</typeparam> /// <param name="callback">handler utilisé lors de la levée de l'événement</param> /// <param name="strategy">stratégie de threading lors de l'exécution du callback</param> /// <param name="throwOnce">indique si l'abonnement est maintenu ou non après le premier déclenchement</param> /// <param name="target">cible de l'abonnement</param> /// <returns>l'instance du bus pour une écriture fluide</returns> /// <remarks>Attention en cas d'utilisation de lambda à ce que ce ne soit pas un champs statique (=> la lambda doit faire référence à la classe qui la contient</remarks> public IEventBus Subscribe <TEvent>(Action <TEvent> callback, ThreadingStrategy strategy, bool throwOnce = false, object target = null) where TEvent : EventBase { return(Subscribe <TEvent>(callback, null, strategy, throwOnce: throwOnce, target: target)); }