コード例 #1
0
        public IDisposable SubscribeToAll(IHandle <IMessage> handler)
        {
            Ensure.NotNull(handler, "handler");
            var allHandler = new MessageHandler <IMessage>(handler, handler.GetType().Name);

            var messageTypes = MessageHierarchy.DescendantsAndSelf(typeof(object)).ToArray();

            for (var i = 0; i < messageTypes.Length; i++)
            {
                Subcribe(allHandler, messageTypes[i]);
            }
            return(new Disposer(() => { this?.Unsubscribe(handler); return Unit.Default; }));
        }
コード例 #2
0
        public void TestMessageDescendents()
        {
            var sut         = typeof(ParentTestEvent);
            var descendants = MessageHierarchy.DescendantsAndSelf(sut).ToList();

            Assert.Equal(3, descendants.Count());
            Assert.Contains(typeof(ParentTestEvent), descendants);
            Assert.Contains(typeof(ChildTestEvent), descendants);
            Assert.Contains(typeof(GrandChildTestEvent), descendants);

            sut         = typeof(GrandChildTestEvent);
            descendants = MessageHierarchy.DescendantsAndSelf(sut).ToList();
            Assert.Single(descendants);
            Assert.Contains(typeof(GrandChildTestEvent), descendants);
        }
コード例 #3
0
        public void TestMessageChildType()
        {
            var sut       = typeof(MessageChild);
            var ancestors = MessageHierarchy.AncestorsAndSelf(sut);

            Assert.Equal(3, ancestors.Count());
            Assert.Contains(typeof(Message), ancestors);
            Assert.Contains(typeof(MessageParent), ancestors);
            Assert.Contains(typeof(MessageChild), ancestors);

            var descendants = MessageHierarchy.DescendantsAndSelf(sut);

            Assert.Single(descendants);
            Assert.Contains(typeof(MessageChild), descendants);
        }
コード例 #4
0
    public static void Main()
    {
        var type = typeof(Message);

        Console.WriteLine("MessageChild has " + MessageHierarchy.AncestorsAndSelf(type).Count() + " Ancestors");
        foreach (var parent in MessageHierarchy.AncestorsAndSelf(type))
        {
            Console.WriteLine(parent);
        }

        Console.WriteLine($"{type} has {MessageHierarchy.DescendantsAndSelf(type).Count()} Descendants");
        foreach (var descendant in MessageHierarchy.DescendantsAndSelf(type))
        {
            Console.WriteLine(descendant);
        }
    }
コード例 #5
0
 private void Subscribe(IMessageHandler handler, bool includeDerived)
 {
     Type[] messageTypes;
     if (includeDerived)
     {
         messageTypes = MessageHierarchy.DescendantsAndSelf(handler.MessageType).ToArray();
     }
     else
     {
         messageTypes = new[] { handler.MessageType };
     }
     for (var i = 0; i < messageTypes.Length; i++)
     {
         Subcribe(handler, messageTypes[i]);
     }
 }
コード例 #6
0
 protected bool HasSubscriberFor(Type type, bool includeDerived)
 {
     Type[] derivedTypes = { type };
     if (includeDerived)
     {
         derivedTypes = MessageHierarchy.DescendantsAndSelf(type).ToArray();
     }
     for (var i = 0; i < derivedTypes.Length; i++)
     {
         var derivedType = derivedTypes[i];
         if (HasSubscriberForExactType(derivedType))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #7
0
        public void Unsubscribe <T>(IHandle <T> handler) where T : Message
        {
            Ensure.NotNull(handler, "handler");
            var descendants = MessageHierarchy.DescendantsAndSelf(typeof(T)).ToArray();

            for (var d = 0; d < descendants.Length; d++)
            {
                var handlers = GetHandlesFor(descendants[d]);
                for (var h = 0; h < handlers.Length; h++)
                {
                    if (!handlers[h].IsSame(typeof(T), handler))
                    {
                        continue;
                    }
                    lock (_handlers) {
                        _handlers[descendants[d]].Remove(handlers[h]);
                    }
                    break;
                }
            }
        }
コード例 #8
0
        private void Subscribe(IMessageHandler handler)
        {
            // Subscribe to the underlying message type and it's descendants
            var messageTypes = MessageHierarchy.DescendantsAndSelf(handler.MessageType).ToArray();

            for (var i = 0; i < messageTypes.Length; i++)
            {
                var messageType = messageTypes[i];
                var handlers    = GetHandlesFor(messageType);
                if (!handlers.Any(hndl => hndl.IsSame(messageType, handler)))
                {
                    lock (_handlers) {
                        if (!_handlers.TryGetValue(messageType, out var handleList))
                        {
                            handleList = new List <IMessageHandler>();
                            _handlers.Add(messageType, handleList);
                        }
                        handleList.Add(handler);
                    }
                }
            }
        }