Exemple #1
0
        public void Send <T> (T message) where T : IMessage
        {
            Contract.AssertNotNull(() => message, message);

            Array listeners = null;

            m_rwlListeners.ReadLocked(() =>
            {
                System.Collections.IList listenersRaw = m_listenersByMessageType.SafeGet(message.GetType( ));
                if (listenersRaw != null)
                {
                    lock ( listenersRaw )
                    {
                        if (listenersRaw.Count > 0)
                        {
                            listeners = new object [listenersRaw.Count];
                            listenersRaw.CopyTo(listeners, 0);
                        }
                    }
                }
            });

            if (listeners != null)
            {
                LogMessage(message, listeners);

                foreach (IListener <T> listener in listeners)
                {
                    // clousure binding fixup
                    IListener <T> listenerCopy = listener;

                    if (message.IsAsync)
                    {
                        Runner.RunAsync(() => listenerCopy.Receive(message));
                    }
                    else
                    {
                        Runner.RunWrapped(() => listenerCopy.Receive(message));
                    }
                }
            }
            else if (typeof(T) != typeof(StatusMessage))
            {
                Logger.Log(
                    StatusMessage.Types.Debug,
                    string.Format("Noone Listening for Message : Type = '{0}', Message = '{1}'.",
                                  typeof(T).FullName,
                                  message),
                    null,
                    "BandSox.Utility.Messaging.Bus.Send<T>()");
            }

            Fabric?.Send(message);
        }
Exemple #2
0
        public void UnListenFor <T> (IListener <T> listener) where T : IMessage
        {
            Logger.Log(
                StatusMessage.Types.Debug,
                string.Format(
                    "Removing listener '{0}' for Message Type '{1}'",
                    listener,
                    typeof(T).FullName),
                null,
                "BandSox.Utility.Messaging.Bus.ListenFor<T>()");

            m_rwlListeners.WriteLocked(() => m_listenersByMessageType.Remove(typeof(T), listener));
            Fabric?.RemoveListener <T> ( );
        }
Exemple #3
0
        public IDisposable ListenFor <T> (IListener <T> listener) where T : IMessage
        {
            Logger.Log(
                StatusMessage.Types.Debug,
                string.Format(
                    "Adding listener '{0}' for Message Type '{1}'",
                    listener,
                    typeof(T).FullName),
                null,
                "BandSox.Utility.Messaging.Bus.ListenFor<T>()");

            m_rwlListeners.WriteLocked(() => m_listenersByMessageType.Add(typeof(T), (object)listener));
            Fabric?.AddListener <T> ( );
            return(new ListnerDisposer <T> (listener));
        }