Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 /// <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));
 }