Przeglądaj źródła

Add a static helper to get handler default subscription mode

Olivier Coanet 3 lat temu
rodzic
commit
be3c8866f4

+ 84 - 0
src/Abc.Zebus.Tests/Dispatch/MessageHandlerInvokerSubscriberTests.cs

@@ -0,0 +1,84 @@
+using System;
+using System.Linq;
+using Abc.Zebus.Dispatch;
+using Abc.Zebus.Routing;
+using Abc.Zebus.Testing.Extensions;
+using NUnit.Framework;
+using StructureMap;
+
+namespace Abc.Zebus.Tests.Dispatch
+{
+    [TestFixture]
+    public class MessageHandlerInvokerSubscriberTests
+    {
+        [TestCase(typeof(DefaultHandler), typeof(Event), SubscriptionMode.Auto)]
+        [TestCase(typeof(DefaultHandler), typeof(RoutableEvent), SubscriptionMode.Manual)]
+        [TestCase(typeof(ManualHandler), typeof(Event), SubscriptionMode.Manual)]
+        [TestCase(typeof(ManualHandler), typeof(RoutableEvent), SubscriptionMode.Manual)]
+        [TestCase(typeof(AutoHandler), typeof(Event), SubscriptionMode.Auto)]
+        [TestCase(typeof(AutoHandler), typeof(RoutableEvent), SubscriptionMode.Auto)]
+        public void should_get_default_subscription_mode(Type handlerType, Type messageType, SubscriptionMode expectedSubscriptionMode)
+        {
+            // Arrange
+            var messageTypeId = MessageUtil.GetTypeId(messageType);
+            var subscriber = MessageHandlerInvokerSubscriber.FromAttributes(handlerType);
+
+            // Act
+            var subscriptions = subscriber.GetStartupSubscriptions(messageType, messageTypeId, new Container()).ToList();
+            var subscriptionMode = MessageHandlerInvokerSubscriber.GetDefaultSubscriptionMode(handlerType, messageType);
+
+            // Assert
+            subscriptionMode.ShouldEqual(expectedSubscriptionMode);
+            if (subscriptionMode == SubscriptionMode.Auto)
+                subscriptions.ShouldBeEquivalentTo(new Subscription(messageTypeId));
+            else
+                subscriptions.ShouldBeEmpty();
+        }
+
+        [Routable]
+        public class RoutableEvent : IEvent
+        {
+            [RoutingPosition(1)]
+            public int Key { get; set; }
+        }
+
+        public class Event : IEvent
+        {
+        }
+
+        public class DefaultHandler : IMessageHandler<RoutableEvent>, IMessageHandler<Event>
+        {
+            public void Handle(RoutableEvent message)
+            {
+            }
+
+            public void Handle(Event message)
+            {
+            }
+        }
+
+        [SubscriptionMode(SubscriptionMode.Manual)]
+        public class ManualHandler : IMessageHandler<RoutableEvent>, IMessageHandler<Event>
+        {
+            public void Handle(RoutableEvent message)
+            {
+            }
+
+            public void Handle(Event message)
+            {
+            }
+        }
+
+        [SubscriptionMode(SubscriptionMode.Auto)]
+        public class AutoHandler : IMessageHandler<RoutableEvent>, IMessageHandler<Event>
+        {
+            public void Handle(RoutableEvent message)
+            {
+            }
+
+            public void Handle(Event message)
+            {
+            }
+        }
+    }
+}

+ 15 - 0
src/Abc.Zebus/Dispatch/MessageHandlerInvokerSubscriber.cs

@@ -42,6 +42,21 @@ namespace Abc.Zebus.Dispatch
             return GetSubscriptionsFromMode(subscriptionMode, messageTypeId);
         }
 
+        /// <summary>
+        /// Gets the default subscription mode for the specified message handler and message type.
+        /// </summary>
+        /// <remarks>
+        /// Note that the startup subscriptions can be overriden if the message handler uses a <see cref="IStartupSubscriber"/>.
+        /// </remarks>
+        public static SubscriptionMode GetDefaultSubscriptionMode(Type messageHandlerType, Type messageType)
+        {
+            var subscriptionModeAttribute = (SubscriptionModeAttribute?)Attribute.GetCustomAttribute(messageHandlerType, typeof(SubscriptionModeAttribute));
+            if (subscriptionModeAttribute != null && subscriptionModeAttribute.StartupSubscriberType == null)
+                return subscriptionModeAttribute.SubscriptionMode;
+
+            return DefaultSubscriptionMode(messageType);
+        }
+
         private static IEnumerable<Subscription> GetSubscriptionsFromSubscriber(IStartupSubscriber startupSubscriber, MessageTypeId messageTypeId, Type messageType)
         {
             return startupSubscriber.GetStartupSubscriptionBindingKeys(messageType)