protected override void Setup(FeatureConfigurationContext context)
        {
            var coreScannerConfig   = context.Settings.Get <AssemblyScannerConfiguration>();
            var unicastRoutingTable = context.Settings.Get <UnicastRoutingTable>();
            var conventions         = context.Settings.Get <Conventions>();

            var messageTypes = TypesScanner.ScanMessageTypes(coreScannerConfig, conventions);

            var routes = new List <RouteTableEntry>();

            foreach (var messageType in messageTypes)
            {
                if (IsRouteDefinedFor(messageType, unicastRoutingTable))
                {
                    continue;
                }

                var routeToAttribute = messageType.GetCustomAttribute <RouteToAttribute>();
                if (routeToAttribute != null)
                {
                    routes.Add(new RouteTableEntry(messageType,
                                                   UnicastRoute.CreateFromEndpointName(routeToAttribute.Destination)));
                }
                else
                {
                    var routeAttribute = messageType.Assembly.GetCustomAttribute <RouteAttribute>();
                    if (conventions.IsCommandType(messageType) &&
                        routeAttribute?.CommandsDestination != null)
                    {
                        routes.Add(new RouteTableEntry(messageType,
                                                       UnicastRoute.CreateFromEndpointName(routeAttribute.CommandsDestination)));
                    }
                    else if (conventions.IsMessageType(messageType) &&
                             routeAttribute?.MessagesDestination != null)
                    {
                        routes.Add(new RouteTableEntry(messageType,
                                                       UnicastRoute.CreateFromEndpointName(routeAttribute.MessagesDestination)));
                    }
                }
            }

            if (routes.Any())
            {
                unicastRoutingTable.AddOrReplaceRoutes("AttributeRoutingSource", routes);
            }
        }
        public void When_using_default_settings_all_messages_should_be_found()
        {
            var assemblyScannerConfig = new AssemblyScannerConfiguration();

            var conventions = new Conventions();

            conventions.Add(new DelegateMessageConvention()
            {
                IsCommandTypeConvention = t => t.Name.EndsWith("Command"),
                IsMessageTypeConvention = t => t.Name.EndsWith("Message")
            });

            var types = TypesScanner.ScanMessageTypes(assemblyScannerConfig, conventions).ToList();

            Assert.Contains(typeof(ACommand), types);
            Assert.Contains(typeof(AMessage), types);
            Assert.Contains(typeof(ThisIsAnExcludedCommand), types);
        }
        public void When_excluding_types_types_from_assembly_should_not_be_found()
        {
            var assemblyScannerConfig = new AssemblyScannerConfiguration();

            assemblyScannerConfig.ExcludeTypes(typeof(ThisIsAnExcludedCommand));

            var conventions = new Conventions();

            conventions.Add(new DelegateMessageConvention()
            {
                IsCommandTypeConvention = t => t.Name.EndsWith("Command"),
                IsMessageTypeConvention = t => t.Name.EndsWith("Message")
            });

            var types = TypesScanner.ScanMessageTypes(assemblyScannerConfig, conventions).ToList();

            Assert.Contains(typeof(ACommand), types);
            Assert.Contains(typeof(AMessage), types);
            Assert.False(types.Contains(typeof(ThisIsAnExcludedCommand)));
        }