public void Handle(object sender, object message, bool trace) { if (ReferenceEquals(_target, sender)) { return; } var messageSenderCache = new MessageSenderCache(sender, message); lock (_handledMessages) { if (MessageSenderCacheComparer.Instance.Equals(_lastMessage, messageSenderCache) || !_handledMessages.Add(messageSenderCache)) { return; } _lastMessage = messageSenderCache; } try { if (_handlers == null) { _handler.Handle(sender, message); if (trace) { Trace(sender, message, _target); } } else { var list = FilterHandlers(message.GetType()); for (int index = 0; index < list.Length; index++) { list[index].Invoke(_target, new[] { sender, message }); if (trace) { Trace(sender, message, _target); } } } } finally { lock (_handledMessages) { _handledMessages.Remove(messageSenderCache); _lastMessage = default(MessageSenderCache); } } }
static EventAggregator() { var subscriber = new ActionSubscriber <object>((o, o1) => { }); EmptyMessage = new MessageSenderCache(subscriber, subscriber, subscriber, 0); }