/// <summary>
        /// Adds the specified saga types
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="types">The state machine types to add</param>
        public static void AddSagas(this IRegistrationConfigurator configurator, params Type[] types)
        {
            IEnumerable <Type> sagaTypes           = types.Where(x => x.HasInterface <ISaga>() && !x.HasInterface <SagaStateMachineInstance>());
            IEnumerable <Type> sagaDefinitionTypes = types.Where(x => x.HasInterface(typeof(ISagaDefinition <>)));

            var sagas = from c in sagaTypes
                        join d in sagaDefinitionTypes on c equals d.GetClosingArgument(typeof(ISagaDefinition <>)) into dc
                        from d in dc.DefaultIfEmpty()
                        select new
            {
                SagaType       = c,
                DefinitionType = d
            };

            foreach (var saga in sagas)
            {
                configurator.AddSaga(saga.SagaType, saga.DefinitionType);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Adds the specified consumer types
        /// </summary>
        /// <param name="configurator"></param>ˆ
        /// <param name="types">The state machine types to add</param>
        public static void AddConsumers(this IRegistrationConfigurator configurator, params Type[] types)
        {
            IEnumerable <Type> consumerTypes           = types.Where(TypeMetadataCache.HasConsumerInterfaces);
            IEnumerable <Type> consumerDefinitionTypes = types.Where(x => x.HasInterface(typeof(IConsumerDefinition <>)));

            var consumers = from c in consumerTypes
                            join d in consumerDefinitionTypes on c equals d.GetClosingArgument(typeof(IConsumerDefinition <>)) into dc
                            from d in dc.DefaultIfEmpty()
                            select new
            {
                ConsumerType   = c,
                DefinitionType = d
            };

            foreach (var consumer in consumers)
            {
                configurator.AddConsumer(consumer.ConsumerType, consumer.DefinitionType);
            }
        }
Exemplo n.º 3
0
        static void AddBus(this IRegistrationConfigurator <IServiceProvider> configurator, Action <IServiceBusBusFactoryConfigurator> configure = null)
        {
            configurator.AddBus(context =>
            {
                IOptions <ServiceBusOptions> options = context.Container.GetRequiredService <IOptions <ServiceBusOptions> >();

                options.Value.MessageHandlerOptions.AutoComplete = true;

                IServiceBusBusConfiguration busConfiguration = context.Container.GetRequiredService <IServiceBusBusConfiguration>();

                var busFactoryConfigurator = new ServiceBusBusFactoryConfigurator(busConfiguration);

                busFactoryConfigurator.Host(options.Value.ConnectionString);
                busFactoryConfigurator.UseServiceBusMessageScheduler();

                configure?.Invoke(busFactoryConfigurator);

                return(busFactoryConfigurator.Build());
            });
        }
Exemplo n.º 4
0
            protected void ConfigureRegistration <T>(IRegistrationConfigurator <T> configurator)
            {
                configurator.AddSagaStateMachine <TestStateMachineSaga, TestInstance>()
                .EntityFrameworkRepository(r =>
                {
                    r.AddDbContext <DbContext, TestInstanceDbContext>(ApplyBuilderOptions);

                    r.ConcurrencyMode = ConcurrencyMode.Pessimistic;
                    if (DbContextOptionsBuilder.Options.Extensions.Any(x => x is NpgsqlOptionsExtension))
                    {
                        r.LockStatementProvider = new PostgresLockStatementProvider(false);
                    }
                    else
                    {
                        r.LockStatementProvider = new SqlServerLockStatementProvider(false);
                    }
                });

                configurator.AddBus(provider => BusControl);
            }
        /// <summary>
        /// Adds the specified consumer types which match the given filter
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="filter"></param>
        /// <param name="types">The consumer types to add</param>
        public static void AddFutures(this IRegistrationConfigurator configurator, Func <Type, bool> filter, params Type[] types)
        {
            filter ??= t => true;

            IEnumerable <Type> consumerTypes           = types.Where(x => x.HasInterface(typeof(SagaStateMachine <FutureState>)));
            IEnumerable <Type> consumerDefinitionTypes = types.Where(x => x.HasInterface(typeof(IFutureDefinition <>)));

            var futures = from c in consumerTypes
                          join d in consumerDefinitionTypes on c equals d.GetClosingArgument(typeof(IFutureDefinition <>)) into dc
                          from d in dc.DefaultIfEmpty()
                              where filter(c)
                          select new
            {
                FutureType     = c,
                DefinitionType = d
            };

            foreach (var future in futures)
            {
                configurator.AddFuture(future.FutureType, future.DefinitionType);
            }
        }
        /// <summary>
        /// Adds the specified activity types
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="types">The state machine types to add</param>
        public static void AddActivities(this IRegistrationConfigurator configurator, params Type[] types)
        {
            IEnumerable <Type> activityTypes           = types.Where(x => x.HasInterface(typeof(IActivity <,>))).ToList();
            IEnumerable <Type> activityDefinitionTypes = types.Where(x => x.HasInterface(typeof(IActivityDefinition <, ,>))).ToList();

            var activities = from c in activityTypes
                             join d in activityDefinitionTypes on c equals d.GetClosingArguments(typeof(IActivityDefinition <, ,>)).First() into dc
                             from d in dc.DefaultIfEmpty()
                             select new
            {
                ActivityType   = c,
                DefinitionType = d
            };

            foreach (var activity in activities)
            {
                configurator.AddActivity(activity.ActivityType, activity.DefinitionType);
            }

            IEnumerable <Type> executeActivityTypes           = types.Where(x => x.HasInterface(typeof(IExecuteActivity <>))).Except(activityTypes).ToList();
            IEnumerable <Type> executeActivityDefinitionTypes = types.Where(x => x.HasInterface(typeof(IExecuteActivityDefinition <,>))).ToList();

            var executeActivities = from c in executeActivityTypes
                                    join d in executeActivityDefinitionTypes on c equals d.GetClosingArguments(typeof(IExecuteActivityDefinition <,>)).First() into dc
                                    from d in dc.DefaultIfEmpty()
                                    select new
            {
                ActivityType   = c,
                DefinitionType = d
            };

            foreach (var executeActivity in executeActivities)
            {
                configurator.AddExecuteActivity(executeActivity.ActivityType, executeActivity.DefinitionType);
            }
        }
 /// <summary>
 /// Adds the consumer, allowing configuration when it is configured on an endpoint
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="configure"></param>
 /// <typeparam name="T">The consumer type</typeparam>
 /// <typeparam name="TDefinition">The consumer definition type</typeparam>
 public static IConsumerRegistrationConfigurator <T> AddConsumer <T, TDefinition>(this IRegistrationConfigurator configurator,
                                                                                  Action <IConsumerConfigurator <T> > configure = null)
     where T : class, IConsumer
     where TDefinition : class, IConsumerDefinition <T>
 {
     return(configurator.AddConsumer(typeof(TDefinition), configure));
 }
Exemplo n.º 8
0
        /// <summary>
        /// Adds a SagaStateMachine to the registry, using the factory method, and updates the registrar prior to registering so that the default
        /// saga registrar isn't notified.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="registrar"></param>
        /// <param name="sagaDefinitionType"></param>
        /// <typeparam name="TStateMachine"></typeparam>
        /// <typeparam name="TInstance"></typeparam>
        public static ISagaRegistrationConfigurator <TInstance> AddSagaStateMachine <TStateMachine, TInstance>(this IRegistrationConfigurator configurator,
                                                                                                               ISagaStateMachineRegistrar registrar, Type sagaDefinitionType = null)
            where TStateMachine : class, SagaStateMachine <TInstance>
            where TInstance : class, SagaStateMachineInstance
        {
            ISagaRegistration Factory(IContainerRegistrar containerRegistrar)
            {
                SagaStateMachineRegistrationCache.Register(typeof(TStateMachine), registrar);

                if (sagaDefinitionType != null)
                {
                    SagaDefinitionRegistrationCache.Register(sagaDefinitionType, containerRegistrar);
                }

                return(new SagaStateMachineRegistration <TInstance>());
            }

            return(configurator.AddSaga <TInstance>(Factory));
        }
 /// <summary>
 /// Adds a SagaStateMachine to the registry and updates the registrar prior to registering so that the default
 /// saga registrar isn't notified.
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="configure"></param>
 /// <typeparam name="TStateMachine">The state machine type</typeparam>
 /// <typeparam name="T">The state machine instance type</typeparam>
 /// <typeparam name="TDefinition">The saga definition type</typeparam>
 public static ISagaRegistrationConfigurator <T> AddSagaStateMachine <TStateMachine, T, TDefinition>(this IRegistrationConfigurator configurator,
                                                                                                     Action <ISagaConfigurator <T> > configure = null)
     where T : class, SagaStateMachineInstance
     where TStateMachine : class, SagaStateMachine <T>
     where TDefinition : class, ISagaDefinition <T>
 {
     return(configurator.AddSagaStateMachine <TStateMachine, T>(typeof(TDefinition), configure));
 }
 /// <summary>
 /// Adds the specified consumer types
 /// </summary>
 /// <param name="configurator"></param>
 /// ˆ
 /// <param name="types">The state machine types to add</param>
 public static void AddFutures(this IRegistrationConfigurator configurator, params Type[] types)
 {
     AddFutures(configurator, null, types);
 }
 public ConsumerRegistrationConfigurator(IRegistrationConfigurator configurator, IConsumerRegistration registration, IContainerRegistrar registrar)
 {
     _configurator = configurator;
     _registration = registration;
     _registrar    = registrar;
 }
        /// <summary>
        /// Create EntityFramework saga repository
        /// </summary>
        /// <param name="registrationConfigurator"></param>
        /// <param name="configure"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static IEntityFrameworkSagaRepository CreateEntityFrameworkSagaRepository(this IRegistrationConfigurator registrationConfigurator,
                                                                                         Action <DbContextOptionsBuilder> configure)
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }
            var optionsBuilder = EntityFrameworkSagaRepository.CreateOptionsBuilder();

            configure(optionsBuilder);
            return(new EntityFrameworkSagaRepository(optionsBuilder.Options));
        }
 /// <summary>
 /// Adds all futures in the specified assemblies
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="assemblies">The assemblies to scan for futures</param>
 public static void AddFutures(this IRegistrationConfigurator configurator, params Assembly[] assemblies)
 {
     AddFutures(configurator, null, assemblies);
 }
Exemplo n.º 14
0
 /// <summary>
 /// Use the Dapper saga repository for sagas configured by type (without a specific generic call to AddSaga/AddSagaStateMachine)
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="connectionString"></param>
 /// <param name="configure"></param>
 public static void SetDapperSagaRepositoryProvider(this IRegistrationConfigurator configurator, string connectionString,
                                                    Action <IDapperSagaRepositoryConfigurator> configure)
 {
     configurator.SetSagaRepositoryProvider(new DapperSagaRepositoryRegistrationProvider(connectionString, configure));
 }
Exemplo n.º 15
0
 public IConsumerRegistrationConfigurator GetConsumerRegistrationConfigurator(IRegistrationConfigurator registrationConfigurator)
 {
     return(new ConsumerRegistrationConfigurator <TConsumer>(registrationConfigurator));
 }
 /// <summary>
 /// Use the Cosmos saga repository for sagas configured by type (without a specific generic call to AddSaga/AddSagaStateMachine)
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="configure"></param>
 public static void SetCosmosSagaRepositoryProvider(this IRegistrationConfigurator configurator, Action <ICosmosSagaRepositoryConfigurator> configure)
 {
     configurator.SetSagaRepositoryProvider(new CosmosSagaRepositoryRegistrationProvider(configure));
 }
Exemplo n.º 17
0
 /// <summary>
 /// Add a <see cref="IMessageScheduler" /> to the container that uses the ActiveMQ scheduler
 /// </summary>
 /// <param name="configurator"></param>
 public static void AddActiveMqMessageScheduler(this IRegistrationConfigurator configurator)
 {
     configurator.AddMessageScheduler(new MessageSchedulerRegistration());
 }
Exemplo n.º 18
0
 protected static void ConfigureRegistration(IRegistrationConfigurator configurator)
 {
     configurator.AddConsumer <RequestConsumer>();
     configurator.AddRequestClient <Request>();
 }
 /// <summary>
 /// Configure the Kebab Case endpoint name formatter
 /// </summary>
 /// <param name="configurator"></param>
 public static void SetKebabCaseEndpointNameFormatter(this IRegistrationConfigurator configurator)
 {
     configurator.SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);
 }
Exemplo n.º 20
0
 protected void ConfigureRegistration <T>(IRegistrationConfigurator <T> configurator)
     where T : class
 {
     configurator.AddConsumer <DependentConsumer>();
     configurator.AddBus(provider => BusControl);
 }
 /// <summary>
 /// Adds the consumer, allowing configuration when it is configured on an endpoint
 /// </summary>
 /// <param name="configurator"></param>
 /// <typeparam name="T">The consumer type</typeparam>
 /// <typeparam name="TDefinition">The consumer definition type</typeparam>
 public static IFutureRegistrationConfigurator <T> AddFuture <T, TDefinition>(this IRegistrationConfigurator configurator)
     where T : MassTransitStateMachine <FutureState>
     where TDefinition : class, IFutureDefinition <T>
 {
     return(configurator.AddFuture <T>(typeof(TDefinition)));
 }
        /// <summary>
        /// Add consumers that were already added to the container to the registration
        /// </summary>
        public static void AddConsumersFromContainer(this IRegistrationConfigurator configurator, IContainer container)
        {
            var consumerTypes = container.FindTypes(TypeMetadataCache.IsConsumerOrDefinition);

            configurator.AddConsumers(consumerTypes);
        }
 /// <summary>
 /// Adds all consumers from the assembly containing the specified type that are in the same (or deeper) namespace.
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="filter"></param>
 /// <typeparam name="T">The anchor type</typeparam>
 public static void AddConsumersFromNamespaceContaining <T>(this IRegistrationConfigurator configurator, Func <Type, bool> filter = null)
 {
     AddConsumersFromNamespaceContaining(configurator, typeof(T), filter);
 }
Exemplo n.º 24
0
 /// <summary>
 /// Add sagas that were already added to the container to the registration
 /// </summary>
 public static void AddSagasFromContainer(this IRegistrationConfigurator configurator, IComponentContext context)
 {
     Type[] sagaTypes = context.FindTypes(TypeMetadataCache.IsSagaOrDefinition);
     configurator.AddSagas(sagaTypes);
 }
 /// <summary>
 /// Use the EntityFramework saga repository for sagas configured by type (without a specific generic call to AddSaga/AddSagaStateMachine)
 /// </summary>
 /// <param name="configurator"></param>
 /// <param name="configure"></param>
 public static void SetEntityFrameworkSagaRepositoryProvider(this IRegistrationConfigurator configurator,
                                                             Action <IEntityFrameworkSagaRepositoryConfigurator> configure)
 {
     configurator.SetSagaRepositoryProvider(new EntityFrameworkSagaRepositoryRegistrationProvider(configure));
 }
 static void AddConsumer(this IRegistrationConfigurator rider)
 {
     rider.AddConsumer <StockConfirmationConsumer>();
     rider.AddConsumer <StockConfirmationFailConsumer>();
     rider.AddConsumer <BuyerCreatedConsumer>();
 }
 public SagaRegistrationConfigurator(IRegistrationConfigurator configurator, IContainerRegistrar registrar)
 {
     _configurator = configurator;
     _registrar    = registrar;
 }
 public ActivityRegistrationConfigurator(IRegistrationConfigurator configurator)
 {
     _configurator = configurator;
 }
        /// <summary>
        /// Add sagas that were already added to the container to the registration
        /// </summary>
        public static void AddSagasFromContainer(this IRegistrationConfigurator configurator, IContainer container)
        {
            var sagaTypes = container.FindTypes(TypeMetadataCache.IsSagaOrDefinition);

            configurator.AddSagas(sagaTypes);
        }
 public static void AddAmazonSqsMessageScheduler(this IRegistrationConfigurator configurator)
 {
     configurator.AddDelayedMessageScheduler();
 }