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); }
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> ( ); }
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)); }