/// <summary>
        /// Configure a service instance, which supports one or more receive endpoints, all of which are managed by conductor.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="options"></param>
        /// <param name="configure"></param>
        public static void ServiceInstance <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                   ServiceInstanceOptions options, Action <IServiceInstanceConfigurator <TEndpointConfigurator> > configure)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var transportConfigurator = Cached <TEndpointConfigurator> .Instance;

            var instance = new ServiceInstance();

            if (options.InstanceEndpointEnabled)
            {
                var definition = new InstanceEndpointDefinition(instance);
                configurator.ReceiveEndpoint(definition, options.EndpointNameFormatter, instanceEndpointConfigurator =>
                {
                    var instanceConfigurator = new ServiceInstanceConfigurator <TEndpointConfigurator>(configurator, transportConfigurator, instance, options,
                                                                                                       instanceEndpointConfigurator);

                    configure?.Invoke(instanceConfigurator);
                });
            }
            else
            {
                var instanceConfigurator = new ServiceInstanceConfigurator <TEndpointConfigurator>(configurator, transportConfigurator, instance, options);

                configure?.Invoke(instanceConfigurator);
            }
        }
Beispiel #2
0
        /// <summary> Registers list of consumer types to listen on mentioned queue. </summary>
        /// <remarks> This registration doesn't use scoped way of consumer generation, this may lead to unpleasant side effects, so best approach is to not use stateful consumers.</remarks>
        public static void AllServiceConsumersToEndpoint <TEndpointConfigurator>(
            this IReceiveConfigurator <TEndpointConfigurator> cfg,
            string queueName,
            IWindsorContainer container,
            Assembly consumerAssembly,
            ILogger logger = null
            )
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            cfg.ReceiveEndpoint(queueName,
                                endpoint =>
            {
                var implementations = container.Kernel.GetAssignableHandlers(typeof(IConsumer))
                                      .Select(x => x.ComponentModel.Implementation).Where(x => x.Assembly == consumerAssembly).ToArray();
                if (null != logger)
                {
                    var message = new StringBuilder();
                    message.Append("Starting to watch endpoint " + queueName + " using following consumers:");
                    foreach (var handler in implementations)
                    {
                        message.Append("\r\n * ");
                        message.Append(handler.FullName);
                    }
                    logger.Info(message);
                }

                endpoint.Consumer(container, implementations);
            }
                                );
        }
        /// <summary>
        /// Configure the endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="context">The container reference</param>
        /// <param name="endpointNameFormatter">Optional, the endpoint name formatter</param>
        /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
        public static void ConfigureEndpoints <T>(this IReceiveConfigurator <T> configurator, IServiceContext context,
                                                  IEndpointNameFormatter endpointNameFormatter = null)
            where T : IReceiveEndpointConfigurator
        {
            var registration = context.GetInstance <IRegistration>();

            registration.ConfigureEndpoints(configurator, endpointNameFormatter);
        }
        /// <summary>
        /// Configure the endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="provider">The container reference</param>
        /// <param name="endpointNameFormatter">Optional, the endpoint name formatter</param>
        /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
        public static void ConfigureEndpoints <T>(this IReceiveConfigurator <T> configurator, IServiceProvider provider,
                                                  IEndpointNameFormatter endpointNameFormatter = null)
            where T : IReceiveEndpointConfigurator
        {
            var registration = provider.GetRequiredService <IRegistration>();

            registration.ConfigureEndpoints(configurator, endpointNameFormatter);
        }
Beispiel #5
0
        /// <summary>
        /// Configure the endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="context">The container reference</param>
        /// <param name="endpointNameFormatter">Optional, the endpoint name formatter</param>
        /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
        public static void ConfigureEndpoints <T>(this IReceiveConfigurator <T> configurator, IComponentContext context,
                                                  IEndpointNameFormatter endpointNameFormatter = null)
            where T : IReceiveEndpointConfigurator
        {
            var registration = context.Resolve <IRegistration>();

            registration.ConfigureEndpoints(configurator, endpointNameFormatter);
        }
        /// <summary>
        /// Configure the endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="container">The container reference</param>
        /// <param name="endpointNameFormatter">Optional, the endpoint name formatter</param>
        /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
        public static void ConfigureEndpoints <T>(this IReceiveConfigurator <T> configurator, IWindsorContainer container,
                                                  IEndpointNameFormatter endpointNameFormatter = null)
            where T : IReceiveEndpointConfigurator
        {
            var registration = container.Resolve <IRegistration>();

            registration.ConfigureEndpoints(configurator, endpointNameFormatter);

            container.Release(registration);
        }
Beispiel #7
0
 public ServiceInstanceConfigurator(IReceiveConfigurator <TEndpointConfigurator> configurator,
                                    IServiceInstanceTransportConfigurator <TEndpointConfigurator> transportConfigurator,
                                    IServiceInstance instance,
                                    ServiceInstanceOptions options,
                                    TEndpointConfigurator instanceEndpointConfigurator = default)
 {
     _configurator          = configurator;
     _transportConfigurator = transportConfigurator;
     _instance = instance;
     _options  = options;
     _instanceEndpointConfigurator = instanceEndpointConfigurator;
 }
Beispiel #8
0
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="registration">The container registration</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IRegistrationContext <IComponentContext> registration, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter && registration.Container.TryResolve <IEndpointNameFormatter>(out var formatter))
            {
                options.SetEndpointNameFormatter(formatter);
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
Beispiel #9
0
        private static void AddReceiveEndpoints(this IReceiveConfigurator cfg, IRegistration registration, IEnumerable <ReceiveEndpointRegistration> receiveEndpoints)
        {
            foreach (var receiveEndpoint in receiveEndpoints)
            {
                cfg.ReceiveEndpoint(receiveEndpoint.QueueName,
                                    ec => ReceiveEndpoint(ec, registration, receiveEndpoint.Consumers, receiveEndpoint.FaultConsumers));

                if (receiveEndpoint.CanUsePriority)
                {
                    cfg.ReceiveEndpoint(receiveEndpoint.QueueName + QueueHelper.GetQueueNameSuffix(QueuePriority.Lowest),
                                        ec => ReceiveEndpoint(ec, registration, receiveEndpoint.Consumers));

                    cfg.ReceiveEndpoint(receiveEndpoint.QueueName + QueueHelper.GetQueueNameSuffix(QueuePriority.Highest),
                                        ec => ReceiveEndpoint(ec, registration, receiveEndpoint.Consumers));
                }
            }
        }
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="container">The container reference</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IWindsorContainer container, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var registration = container.Resolve <IRegistration>();

            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter && container.Kernel.HasComponent(typeof(IEndpointNameFormatter)))
            {
                options.SetEndpointNameFormatter(container.Kernel.Resolve <IEndpointNameFormatter>());
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="registration">The container registration</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IRegistrationContext <IServiceProvider> registration, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter)
            {
                var formatter = registration.Container.GetService <IEndpointNameFormatter>();
                if (formatter != null)
                {
                    options.SetEndpointNameFormatter(formatter);
                }
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
Beispiel #12
0
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="context">The container reference</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IContext context, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var registration = context.GetInstance <IRegistration>();

            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter)
            {
                var formatter = context.TryGetInstance <IEndpointNameFormatter>();
                if (formatter != null)
                {
                    options.SetEndpointNameFormatter(formatter);
                }
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
Beispiel #13
0
        public void ConfigureEndpoints <T>(IReceiveConfigurator <T> configurator, IEndpointNameFormatter endpointNameFormatter)
            where T : IReceiveEndpointConfigurator
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            if (endpointNameFormatter == null)
            {
                endpointNameFormatter = _configurationServiceProvider.GetService <IEndpointNameFormatter>()
                                        ?? DefaultEndpointNameFormatter.Instance;
            }

            var consumersByEndpoint = _consumers.Values
                                      .Select(x => x.GetDefinition(_configurationServiceProvider))
                                      .GroupBy(x => x.GetEndpointName(endpointNameFormatter));

            var sagasByEndpoint = _sagas.Values
                                  .Select(x => x.GetDefinition(_configurationServiceProvider))
                                  .GroupBy(x => x.GetEndpointName(endpointNameFormatter));

            var activities = _activities.Values
                             .Select(x => x.GetDefinition(_configurationServiceProvider))
                             .ToArray();

            var activitiesByExecuteEndpoint = activities
                                              .GroupBy(x => x.GetExecuteEndpointName(endpointNameFormatter));

            var activitiesByCompensateEndpoint = activities
                                                 .GroupBy(x => x.GetCompensateEndpointName(endpointNameFormatter));

            var executeActivitiesByEndpoint = _executeActivities.Values
                                              .Select(x => x.GetDefinition(_configurationServiceProvider))
                                              .GroupBy(x => x.GetExecuteEndpointName(endpointNameFormatter));

            var endpointsWithName = _endpoints.Values
                                    .Select(x => x.GetDefinition(_configurationServiceProvider))
                                    .Select(x => new
            {
                Definition = x,
                Name       = x.GetEndpointName(endpointNameFormatter)
            })
                                    .GroupBy(x => x.Name, (name, values) => new
            {
                Name       = name,
                Definition = values.Select(x => x.Definition).Combine()
            });

            var endpointNames = consumersByEndpoint.Select(x => x.Key)
                                .Union(sagasByEndpoint.Select(x => x.Key))
                                .Union(activitiesByExecuteEndpoint.Select(x => x.Key))
                                .Union(executeActivitiesByEndpoint.Select(x => x.Key))
                                .Union(endpointsWithName.Select(x => x.Name))
                                .Except(activitiesByCompensateEndpoint.Select(x => x.Key));

            var endpoints =
                from e in endpointNames
                join c in consumersByEndpoint on e equals c.Key into cs
                from c in cs.DefaultIfEmpty()
                join s in sagasByEndpoint on e equals s.Key into ss
                from s in ss.DefaultIfEmpty()
                join a in activitiesByExecuteEndpoint on e equals a.Key into aes
                from a in aes.DefaultIfEmpty()
                join ea in executeActivitiesByEndpoint on e equals ea.Key into eas
                from ea in eas.DefaultIfEmpty()
                join ep in endpointsWithName on e equals ep.Name into eps
                from ep in eps.Select(x => x.Definition)
                .DefaultIfEmpty(c?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x)).Combine()
                                ?? s?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x)).Combine()
                                ?? a?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x)).Combine()
                                ?? ea?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x)).Combine()
                                ?? new NamedEndpointDefinition(e))
                select new
            {
                Name              = e,
                Definition        = ep,
                Consumers         = c,
                Sagas             = s,
                Activities        = a,
                ExecuteActivities = ea
            };

            foreach (var endpoint in endpoints)
            {
                configurator.ReceiveEndpoint(endpoint.Definition, endpointNameFormatter, cfg =>
                {
                    if (endpoint.Consumers != null)
                    {
                        foreach (var consumer in endpoint.Consumers)
                        {
                            ConfigureConsumer(consumer.ConsumerType, cfg);
                        }
                    }

                    if (endpoint.Sagas != null)
                    {
                        foreach (var saga in endpoint.Sagas)
                        {
                            ConfigureSaga(saga.SagaType, cfg);
                        }
                    }

                    if (endpoint.Activities != null)
                    {
                        foreach (var activity in endpoint.Activities)
                        {
                            var compensateEndpointName = activity.GetCompensateEndpointName(endpointNameFormatter);

                            var compensateDefinition = endpointsWithName.SingleOrDefault(x => x.Name == compensateEndpointName)?.Definition;
                            if (compensateDefinition != null)
                            {
                                configurator.ReceiveEndpoint(compensateDefinition, endpointNameFormatter, compensateEndpointConfigurator =>
                                {
                                    ConfigureActivity(activity.ActivityType, cfg, compensateEndpointConfigurator);
                                });
                            }
                            else
                            {
                                configurator.ReceiveEndpoint(compensateEndpointName, compensateEndpointConfigurator =>
                                {
                                    ConfigureActivity(activity.ActivityType, cfg, compensateEndpointConfigurator);
                                });
                            }
                        }
                    }

                    if (endpoint.ExecuteActivities != null)
                    {
                        foreach (var activity in endpoint.ExecuteActivities)
                        {
                            ConfigureExecuteActivity(activity.ActivityType, cfg);
                        }
                    }
                });
            }
        }
 /// <summary>
 /// Configure the endpoints for all defined consumer, saga, and activity types using an optional
 /// endpoint name formatter. If no endpoint name formatter is specified and an <see cref="IEndpointNameFormatter" />
 /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter" />
 /// is used.
 /// </summary>
 /// <param name="configurator">The <see cref="IBusFactoryConfigurator" /> for the bus being configured</param>
 /// <param name="registration">The registration for this bus instance</param>
 /// <param name="endpointNameFormatter">Optional, the endpoint name formatter</param>
 /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
 public static void ConfigureEndpoints <T>(this IReceiveConfigurator <T> configurator, IBusRegistrationContext registration,
                                           IEndpointNameFormatter endpointNameFormatter = null)
     where T : IReceiveEndpointConfigurator
 {
     registration.ConfigureEndpoints(configurator, endpointNameFormatter);
 }
        public void ConfigureEndpoints <T>(IReceiveConfigurator <T> configurator, IEndpointNameFormatter endpointNameFormatter,
                                           Action <IRegistrationFilterConfigurator> configureFilter)
            where T : IReceiveEndpointConfigurator
        {
            endpointNameFormatter ??= GetService <IEndpointNameFormatter>() ?? DefaultEndpointNameFormatter.Instance;

            var builder = new RegistrationFilterConfigurator();

            configureFilter?.Invoke(builder);

            var registrationFilter = builder.Filter;

            List <IGrouping <string, IConsumerDefinition> > consumersByEndpoint = Consumers.Values
                                                                                  .Where(x => registrationFilter.Matches(x) && !WasConfigured(x.ConsumerType))
                                                                                  .Select(x => x.GetDefinition(this))
                                                                                  .GroupBy(x => x.GetEndpointName(endpointNameFormatter))
                                                                                  .ToList();

            List <IGrouping <string, ISagaDefinition> > sagasByEndpoint = Sagas.Values
                                                                          .Where(x => registrationFilter.Matches(x) && !WasConfigured(x.SagaType))
                                                                          .Select(x => x.GetDefinition(this))
                                                                          .GroupBy(x => x.GetEndpointName(endpointNameFormatter))
                                                                          .ToList();

            List <IActivityDefinition> activities = Activities.Values
                                                    .Where(x => registrationFilter.Matches(x) && !WasConfigured(x.ActivityType))
                                                    .Select(x => x.GetDefinition(this))
                                                    .ToList();

            List <IGrouping <string, IActivityDefinition> > activitiesByExecuteEndpoint = activities
                                                                                          .GroupBy(x => x.GetExecuteEndpointName(endpointNameFormatter))
                                                                                          .ToList();

            List <IGrouping <string, IActivityDefinition> > activitiesByCompensateEndpoint = activities
                                                                                             .GroupBy(x => x.GetCompensateEndpointName(endpointNameFormatter))
                                                                                             .ToList();

            List <IGrouping <string, IExecuteActivityDefinition> > executeActivitiesByEndpoint = ExecuteActivities.Values
                                                                                                 .Where(x => registrationFilter.Matches(x) && !WasConfigured(x.ActivityType))
                                                                                                 .Select(x => x.GetDefinition(this))
                                                                                                 .GroupBy(x => x.GetExecuteEndpointName(endpointNameFormatter))
                                                                                                 .ToList();

            var endpointsWithName = _endpoints.Values
                                    .Select(x => x.GetDefinition(this))
                                    .Select(x => new
            {
                Name       = x.GetEndpointName(endpointNameFormatter),
                Definition = x
            })
                                    .GroupBy(x => x.Name, (name, values) => new
            {
                Name       = name,
                Definition = values.Select(x => x.Definition).Combine()
            })
                                    .ToList();

            IEnumerable <string> endpointNames = consumersByEndpoint.Select(x => x.Key)
                                                 .Union(sagasByEndpoint.Select(x => x.Key))
                                                 .Union(activitiesByExecuteEndpoint.Select(x => x.Key))
                                                 .Union(executeActivitiesByEndpoint.Select(x => x.Key))
                                                 .Union(endpointsWithName.Select(x => x.Name))
                                                 .Except(activitiesByCompensateEndpoint.Select(x => x.Key));

            var endpoints =
                from e in endpointNames
                join c in consumersByEndpoint on e equals c.Key into cs
                from c in cs.DefaultIfEmpty()
                join s in sagasByEndpoint on e equals s.Key into ss
                from s in ss.DefaultIfEmpty()
                join a in activitiesByExecuteEndpoint on e equals a.Key into aes
                from a in aes.DefaultIfEmpty()
                join ea in executeActivitiesByEndpoint on e equals ea.Key into eas
                from ea in eas.DefaultIfEmpty()
                join ep in endpointsWithName on e equals ep.Name into eps
                from ep in eps.Select(x => x.Definition)
                .DefaultIfEmpty(c?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x, x.EndpointDefinition)).Combine()
                                ?? s?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x, x.EndpointDefinition)).Combine()
                                ?? a?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x, x.ExecuteEndpointDefinition)).Combine()
                                ?? ea?.Select(x => (IEndpointDefinition) new DelegateEndpointDefinition(e, x, x.ExecuteEndpointDefinition)).Combine()
                                ?? new NamedEndpointDefinition(e))
                select new
            {
                Name              = e,
                Definition        = ep,
                Consumers         = c,
                Sagas             = s,
                Activities        = a,
                ExecuteActivities = ea
            };

            foreach (var endpoint in endpoints)
            {
                configurator.ReceiveEndpoint(endpoint.Definition, endpointNameFormatter, cfg =>
                {
                    if (endpoint.Consumers != null)
                    {
                        foreach (var consumer in endpoint.Consumers)
                        {
                            ConfigureConsumer(consumer.ConsumerType, cfg);
                        }
                    }

                    if (endpoint.Sagas != null)
                    {
                        foreach (var saga in endpoint.Sagas)
                        {
                            ConfigureSaga(saga.SagaType, cfg);
                        }
                    }

                    if (endpoint.Activities != null)
                    {
                        foreach (var activity in endpoint.Activities)
                        {
                            var compensateEndpointName = activity.GetCompensateEndpointName(endpointNameFormatter);

                            var compensateDefinition = activity.CompensateEndpointDefinition ??
                                                       endpointsWithName.SingleOrDefault(x => x.Name == compensateEndpointName)?.Definition;

                            if (compensateDefinition != null)
                            {
                                configurator.ReceiveEndpoint(compensateDefinition, endpointNameFormatter, compensateEndpointConfigurator =>
                                {
                                    ConfigureActivity(activity.ActivityType, cfg, compensateEndpointConfigurator);
                                });
                            }
                            else
                            {
                                configurator.ReceiveEndpoint(compensateEndpointName, compensateEndpointConfigurator =>
                                {
                                    ConfigureActivity(activity.ActivityType, cfg, compensateEndpointConfigurator);
                                });
                            }
                        }
                    }

                    if (endpoint.ExecuteActivities != null)
                    {
                        foreach (var activity in endpoint.ExecuteActivities)
                        {
                            ConfigureExecuteActivity(activity.ActivityType, cfg);
                        }
                    }
                });
            }
        }
 public void ConfigureEndpoints <T>(IReceiveConfigurator <T> configurator, IEndpointNameFormatter endpointNameFormatter = null)
     where T : IReceiveEndpointConfigurator
 {
     ConfigureEndpoints(configurator, endpointNameFormatter, NoFilter);
 }
Beispiel #17
0
 public InMemoryServiceInstanceConfigurator(IReceiveConfigurator <IInMemoryReceiveEndpointConfigurator> configurator, IServiceInstance instance)
     : base(configurator, instance)
 {
 }
 /// <summary>
 /// Configure a service instance, which supports one or more receive endpoints, all of which are managed by conductor.
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="configure"></param>
 public static void ServiceInstance <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                            Action <IServiceInstanceConfigurator <TEndpointConfigurator> > configure)
     where TEndpointConfigurator : IReceiveEndpointConfigurator
 {
     ServiceInstance(configurator, new ServiceInstanceOptions(), configure);
 }
 protected override void ConfigureServiceEndpoints(IReceiveConfigurator <IInMemoryReceiveEndpointConfigurator> configurator)
 {
     configurator.ConfigureServiceEndpoints(GetRegistrationContext(), Options);
 }
 public void ConfigureEndpoints <T>(IReceiveConfigurator <T> configurator, IEndpointNameFormatter endpointNameFormatter = null)
     where T : IReceiveEndpointConfigurator
 {
     _registration.ConfigureEndpoints(configurator, endpointNameFormatter);
 }
Beispiel #21
0
 public ServiceBusServiceInstanceConfigurator(IReceiveConfigurator <IServiceBusReceiveEndpointConfigurator> configurator, IServiceInstance instance)
     : base(configurator, instance)
 {
 }
Beispiel #22
0
 protected override void ConfigureServiceEndpoints(IReceiveConfigurator <IInMemoryReceiveEndpointConfigurator> configurator)
 {
     configurator.ConfigureServiceEndpoints(_container, Options);
 }
Beispiel #23
0
 public ActiveMqServiceInstanceConfigurator(IReceiveConfigurator <IActiveMqReceiveEndpointConfigurator> configurator, IServiceInstance instance)
     : base(configurator, instance)
 {
 }
 public ServiceInstanceConfigurator(IReceiveConfigurator <TEndpointConfigurator> configurator, IServiceInstance instance)
 {
     _configurator = configurator;
     _instance     = instance;
 }
Beispiel #25
0
 protected abstract void ConfigureServiceEndpoints(IReceiveConfigurator <IInMemoryReceiveEndpointConfigurator> configurator);