Exemplo n.º 1
0
        public static IChatterBuilder AddSqlServiceBroker(this IChatterBuilder builder, Action <SqlServiceBrokerOptionsBuilder> optionsBuilder = null)
        {
            var optBuilder = builder.Services.AddSqlServiceBrokerOptions();

            optionsBuilder?.Invoke(optBuilder);
            var options = optBuilder.Build();

            builder.Services.AddIfNotRegistered <SqlServiceBrokerReceiver>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <SqlServiceBrokerSenderFactory>(ServiceLifetime.Singleton);

            builder.Services.AddIfNotRegistered <SqlServiceBrokerSender>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <SqlServiceBrokerReceiverFactory>(ServiceLifetime.Singleton);

            builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, SqlCircuitBreakerExceptionPredicatesProvider>();
            builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, SqlRetryExceptionPredicatesProvider>();

            builder.Services.AddSingleton <IMessagingInfrastructure>(sp =>
            {
                var sender   = sp.GetRequiredService <SqlServiceBrokerSenderFactory>();
                var receiver = sp.GetRequiredService <SqlServiceBrokerReceiverFactory>();
                return(new MessagingInfrastructure(SSBMessageContext.InfrastructureType, receiver, sender));
            });

            builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonUnicodeBodyConverter>();
            builder.Services.AddSingleton(options);

            return(builder);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Configures a change feed for specified table
        /// </summary>
        /// <typeparam name="TRowChangedData">The <see cref="IMessage"/> representing the state of a changed row in the table being watched</typeparam>
        /// <param name="connectionString">The connection string for the sql server with the database and table to watch for changes</param>
        /// <param name="databaseName">Optional. The database containing the table to watch. If not specified, Database or InitialCatalog of the connectionString will be used.</param>
        /// <param name="tableName">The name of the table to watch</param>
        /// <param name="optionsBuilder">An optional builder allowing more complex change feed configuration</param>
        /// <returns><see cref="IChatterBuilder"/></returns>
        public static IChatterBuilder AddSqlChangeFeed <TRowChangedData>(this IChatterBuilder builder,
                                                                         string connectionString,
                                                                         string databaseName,
                                                                         string tableName,
                                                                         Action <SqlChangeFeedOptionsBuilder> optionsBuilder = null)
            where TRowChangedData : class, IMessage, new()
        {
            var changeFeedOptions = builder.Services.AddSqlChangeFeedOptionsBuilder(connectionString, tableName, databaseName);

            optionsBuilder?.Invoke(changeFeedOptions);
            SqlChangeFeedOptions options = changeFeedOptions.Build();

            builder.Services.AddIfNotRegistered <ISqlDependencyManager <TRowChangedData> >(ServiceLifetime.Scoped, sp =>
            {
                return(new SqlDependencyManager <TRowChangedData>(options));
            });

            builder.AddSqlServiceBroker(ssbBuilder =>
            {
                var receiver = string.IsNullOrWhiteSpace(options.ChangeFeedQueueName) ? $"{ChatterServiceBrokerConstants.ChatterQueuePrefix}{typeof(TRowChangedData).Name}" : options.ChangeFeedQueueName;
                var dlq      = string.IsNullOrWhiteSpace(options.ChangeFeedDeadLetterServiceName) ? $"{ChatterServiceBrokerConstants.ChatterDeadLetterServicePrefix}{typeof(TRowChangedData).Name}" : options.ChangeFeedDeadLetterServiceName;
                ssbBuilder.AddSqlServiceBrokerOptions(options.ServiceBrokerOptions)
                .AddQueueReceiver <ProcessChangeFeedCommand <TRowChangedData> >(receiver,
                                                                                errorQueuePath: options.ReceiverOptions.ErrorQueuePath,
                                                                                transactionMode: options.ReceiverOptions.TransactionMode,
                                                                                deadLetterServicePath: dlq);
            });

            if (options.ProcessChangeFeedCommandViaChatter)
            {
                builder.Services.Replace <IBrokeredMessageReceiver <ProcessChangeFeedCommand <TRowChangedData> >, ChangeFeedReceiver <ProcessChangeFeedCommand <TRowChangedData>, TRowChangedData> >(ServiceLifetime.Scoped);
            }

            return(builder);
        }
Exemplo n.º 3
0
 public WhenGettingProperties()
 {
     _serviceCollection        = new Mock <IServiceCollection>();
     _configuration            = new Mock <IConfiguration>();
     _assemblySourceFilterMock = new Mock <IAssemblySourceFilter>();
     _sut = ChatterBuilder.Create(_serviceCollection.Object, _configuration.Object, _assemblySourceFilterMock.Object);
 }
Exemplo n.º 4
0
        /// <summary>
        /// Adds Azure Service Bus as messaging infrastructure for Chatter.MessageBrokers. <see cref="ServiceBusOptions"/> configured via configuration.
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configSectionName"></param>
        /// <returns></returns>
        public static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, Action <ServiceBusOptionsBuilder> optionsBuilder = null)
        {
            var optBuilder = ServiceBusOptionsBuilder.Create(builder.Services, builder.Configuration);

            optionsBuilder?.Invoke(optBuilder);
            var options = optBuilder.Build();

            return(AddAzureServiceBus(builder, options));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Scans all assemblies for classes decorated with <see cref="BrokeredMessageAttribute"/> and have a non-null <see cref="BrokeredMessageAttribute.ReceiverName"/>. Registers:
        /// </summary>
        /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param>
        /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns>
        private static IChatterBuilder AddAllReceivers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies)
        {
            var messages = FindBrokeredMessagesWithReceiversInAssembliesByType(assemblies);

            foreach (var receiverType in GetAllReceiverTypes(messages))
            {
                builder.Services.AddReceiverImpl(receiverType.Item2, receiverType.Item1);
            }
            return(builder);
        }
Exemplo n.º 6
0
        public static IChatterBuilder AddSagas(this IChatterBuilder builder)
        {
            builder.Services.AddScoped <IDispatchMessages, SagaMessageDispatcher>();
            builder.Services.AddSingleton <ISagaPersister, InMemorySagaPersister>();
            builder.Services.AddScoped <ISagaOrchestrator, SagaOrchestrator>();
            builder.Services.AddScoped <ISagaInitializer, SagaInitializer>();
            builder.Services.AddScoped <ISagaOptionsProvider, SagaOptionsProvider>();

            return(builder);
        }
        /// <summary>
        /// Scans all assemblies for classes decorated with <see cref="BrokeredMessageAttribute"/> and have a non-null <see cref="BrokeredMessageAttribute.ReceiverName"/>. Registers:
        /// </summary>
        /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param>
        /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns>
        private static IChatterBuilder AddReceivers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies)
        {
            var messages = FindBrokeredMessagesWithReceiversInAssembliesByType(assemblies);

            foreach (var receiverType in GetAllReceiverTypes(messages))
            {
                builder.Services.AddScoped(receiverType.Item1, receiverType.Item2);
                builder.Services.AddSingleton(typeof(IHostedService), sp =>
                {
                    using var scope = sp.CreateScope();
                    return(scope.ServiceProvider.GetRequiredService(receiverType.Item1));
                });
            }
            return(builder);
        }
Exemplo n.º 8
0
        internal static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <CommandPipelineBuilder> pipelineBuilder)
        {
            var pipeline = chatterBuilder.Services.CreatePipelineBuilder();

            if (pipeline is null)
            {
                return(chatterBuilder);
            }

            chatterBuilder.Services.AddTransient(typeof(ICommandBehaviorPipeline <>), typeof(CommandBehaviorPipeline <>));

            pipelineBuilder?.Invoke(pipeline);

            return(chatterBuilder);
        }
        private static IChatterBuilder AddAzureServiceBus(IChatterBuilder builder)
        {
            builder.Services.AddScoped <IBrokeredMessageDetailProvider, BrokeredMessageAttributeProvider>();
            builder.Services.AddSingleton <IBrokeredMessageInfrastructureDispatcher, ServiceBusMessageSender>();
            builder.Services.AddSingleton <BrokeredMessageSenderPool>();

            builder.Services.Scan(s =>
                                  s.FromAssemblies(AppDomain.CurrentDomain.GetAssemblies())
                                  .AddClasses(c => c.AssignableTo(typeof(IMessagingInfrastructureReceiver <>)))
                                  .UsingRegistrationStrategy(RegistrationStrategy.Skip)
                                  .AsImplementedInterfaces()
                                  .WithScopedLifetime());

            return(builder);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Configures a change feed for specified table
        /// </summary>
        /// <param name="rowChangedDataType">A type implementing <see cref="IMessage"/> that maps to a row that changed in the target database</param>
        /// <param name="connectionString">The connection string for the sql server with the database and table to watch for changes</param>
        /// <param name="databaseName">Optional. The database containing the table to watch. If not specified, Database or InitialCatalog of the connectionString will be used.</param>
        /// <param name="tableName">The name of the table to watch</param>
        /// <param name="optionsBuilder">An optional builder allowing more complex change feed configuration</param>
        public static IChatterBuilder AddSqlChangeFeed(this IChatterBuilder builder,
                                                       Type rowChangedDataType,
                                                       string connectionString,
                                                       string databaseName,
                                                       string tableName,
                                                       Action <SqlChangeFeedOptionsBuilder> optionsBuilder = null)
        {
            typeof(SqlChangeFeedExtensions).GetMethods()
            .Where(m => m.IsGenericMethod &&
                   m.Name == nameof(AddSqlChangeFeed))
            .FirstOrDefault()
            .MakeGenericMethod(rowChangedDataType)
            .Invoke(null, new object[] { builder, connectionString, databaseName, tableName, optionsBuilder });

            return(builder);
        }
Exemplo n.º 11
0
        public static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <PipelineBuilder> pipelineBulder)
        {
            var pipeline = chatterBuilder.Services.CreatePipelineBuiler();

            if (pipeline is null)
            {
                return(chatterBuilder);
            }

            chatterBuilder.Services.Scan(s =>
                                         s.FromApplicationDependencies() //TODO: do we need to use marker types?
                                         .AddClasses(c => c.AssignableTo(typeof(ICommandBehaviorPipeline <>)))
                                         .UsingRegistrationStrategy(RegistrationStrategy.Throw)
                                         .AsImplementedInterfaces()
                                         .WithTransientLifetime());

            pipelineBulder?.Invoke(pipeline);

            return(chatterBuilder);
        }
        /// <summary>
        /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies.
        /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so.
        /// Registers all routers.
        /// </summary>
        /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param>
        /// <param name="assemblies">The assemblies that are required for registering receivers</param>
        /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns>
        public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies, Action <MessageBrokerOptionsBuilder> optionsBuilder = null)
        {
            var messageBrokerOptionsBuilder = builder.Services.AddMessageBrokerOptions();

            optionsBuilder?.Invoke(messageBrokerOptionsBuilder);
            MessageBrokerOptions options = messageBrokerOptionsBuilder.Build();

            builder.Services.AddScoped <IBrokeredMessageDispatcher, BrokeredMessageDispatcher>();

            builder.Services.AddScoped <IForwardMessages, ForwardingRouter>();
            builder.Services.AddScoped <IRouteCompensationMessages, CompensateRouter>();
            builder.Services.AddScoped <IReplyRouter, ReplyRouter>();

            builder.Services.AddScoped <IOutboxProcessor, OutboxProcessor>();
            builder.Services.AddIfNotRegistered <IBrokeredMessageOutbox, InMemoryBrokeredMessageOutbox>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IBrokeredMessageInbox, InMemoryBrokeredMessageInbox>(ServiceLifetime.Scoped);

            if (options?.Reliability?.RouteMessagesToOutbox ?? false)
            {
                builder.Services.AddScoped <IRouteBrokeredMessages, OutboxBrokeredMessageRouter>();

                if (options?.Reliability?.EnableOutboxPollingProcessor ?? false)
                {
                    builder.Services.AddHostedService <BrokeredMessageOutboxProcessor>();
                }
            }
            else
            {
                builder.Services.AddScoped <IRouteBrokeredMessages, BrokeredMessageRouter>();
            }

            builder.Services.Decorate <IMessageDispatcher, RoutingSlipMessageDispatcherDecorator>(); //TODO: we'll only want to add this if routing slips are added
            builder.AddReceivers(assemblies);

            builder.Services.AddScoped <IBodyConverterFactory, BodyConverterFactory>();
            builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonBodyConverter>();

            return(builder);
        }
Exemplo n.º 13
0
        private static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, ServiceBusOptions options)
        {
            builder.Services.AddScoped <ServiceBusReceiver>();
            builder.Services.AddSingleton <ServiceBusReceiverFactory>();

            builder.Services.AddScoped <ServiceBusMessageSender>();
            builder.Services.AddSingleton <ServiceBusMessageSenderFactory>();

            builder.Services.AddSingleton <BrokeredMessageSenderPool>();
            builder.Services.AddSingleton <AzureServiceBusEntityPathBuilder>();

            builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, ServiceBusCircuitBreakerExceptionPredicatesProvider>();
            builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, ServiceBusRetryExceptionPredicatesProvider>();

            builder.Services.AddSingleton <IMessagingInfrastructure>(sp =>
            {
                var sender      = sp.GetRequiredService <ServiceBusMessageSenderFactory>();
                var receiver    = sp.GetRequiredService <ServiceBusReceiverFactory>();
                var pathBuilder = sp.GetRequiredService <AzureServiceBusEntityPathBuilder>();
                return(new MessagingInfrastructure(ASBMessageContext.InfrastructureType, receiver, sender, pathBuilder));
            });

            return(builder);
        }
 /// <summary>
 /// Adds registrations required for Azure Service Bus integration with Chatter.CQRS, including <see cref="ServiceBusOptions"/>, queue, topic and subscription factories and publishers.
 /// </summary>
 /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param>
 /// <param name="configSectionName">The configuration section name containing Azure Service Bus configuration values used to build a <see cref="ServiceBusOptions"/> instance. 'ServiceBus' is the default value.</param>
 /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns>
 public static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, Action <ServiceBusOptionsBuilder> optionsBuilder)
 {
     optionsBuilder(builder.Services.AddAzureServiceBus());
     return(AddAzureServiceBus(builder));
 }
Exemplo n.º 15
0
 /// <summary>
 /// Adds and configured Chatter message broker related capabilities
 /// </summary>
 /// <param name="builder">A <see cref="IChatterBuilder"/> used for registration and setup</param>
 /// <param name="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
 /// <param name="markerTypesForRequiredAssemblies">Marker types whose parent assemblies will be used to find <see cref="IBrokeredMessageReceiver{TMessage}"/> for registration. Will override any assemblies located via <see cref="AssemblySourceFilter"/> created during Chatter cqrs configuration.</param>
 /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
 public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Type[] markerTypesForRequiredAssemblies)
 => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithMarkerTypes(markerTypesForRequiredAssemblies));
 /// <summary>
 /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies.
 /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so.
 /// Registers all routers.
 /// </summary>
 /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param>
 /// <param name="markerTypesForRequiredAssemblies">The <see cref="Type"/>s from assemblies that are required for registering receivers</param>
 /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns>
 public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, params Type[] markerTypesForRequiredAssemblies)
 {
     return(AddMessageBrokers(builder, null, markerTypesForRequiredAssemblies));
 }
        /// <summary>
        /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies.
        /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so.
        /// Registers all routers.
        /// </summary>
        /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param>
        /// <param name="markerTypesForRequiredAssemblies">The <see cref="Type"/>s from assemblies that are required for registering receivers</param>
        /// <param name="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
        /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns>
        public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Type[] markerTypesForRequiredAssemblies)
        {
            var assemblies = markerTypesForRequiredAssemblies.GetAssembliesFromMarkerTypes();

            return(AddMessageBrokers(builder, assemblies, messageBrokerOptionsBuilder));
        }
Exemplo n.º 18
0
 /// <summary>
 /// Adds and configured Chatter message broker related capabilities
 /// </summary>
 /// <param name="builder">A <see cref="IChatterBuilder"/> used for registration and setup</param>
 /// <param name="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
 /// <param name="receiverAssemblies">Assemblies that will be used to find <see cref="IBrokeredMessageReceiver{TMessage}"/> for registration. Will override any assemblies located via <see cref="AssemblySourceFilter"/> created during Chatter cqrs configuration.</param>
 /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
 public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Assembly[] receiverAssemblies)
 => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithExplicitAssemblies(receiverAssemblies));
Exemplo n.º 19
0
 /// <summary>
 /// Adds and configured Chatter message broker related capabilities
 /// </summary>
 /// <param name="builder">A <see cref="IChatterBuilder"/> used for registration and setup</param>
 /// <param name="receiverNamespaceSelector">A namespace selector used to find assemblies containing types with matching namespaces or assemblies with matching FullName. Supports '*' and '?' wildcard values. Matching assemblies used to find <see cref="IBrokeredMessageReceiver{TMessage}"/> for registration. Will override any assemblies located via <see cref="AssemblySourceFilter"/> created during Chatter cqrs configuration.</param>
 /// <param name="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
 /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
 public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, string receiverNamespaceSelector, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null)
 => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithNamespaceSelector(receiverNamespaceSelector));
Exemplo n.º 20
0
        /// <summary>
        /// Adds and configured Chatter message broker related capabilities
        /// </summary>
        /// <param name="builder">A <see cref="IChatterBuilder"/> used for registration and setup</param>
        /// <param name="receiverHandlerSourceBuilder">An optional builder used to define an <see cref="AssemblySourceFilter"/>. Assemblies will be used to find <see cref="IBrokeredMessageReceiver{TMessage}"/> for registration. Will override any assemblies located via <see cref="AssemblySourceFilter"/> created during Chatter cqrs configuration.</param>
        /// <param name="optionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
        /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
        public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> optionsBuilder = null, Action <AssemblySourceFilterBuilder> receiverHandlerSourceBuilder = null)
        {
            var filter = builder.AssemblySourceFilter;

            if (receiverHandlerSourceBuilder != null)
            {
                var filterBuilder = AssemblySourceFilterBuilder.New();
                receiverHandlerSourceBuilder(filterBuilder);
                filter = filterBuilder.Build();
            }
            var assemblies = filter.Apply();

            var messageBrokerOptionsBuilder = builder.Services.AddMessageBrokerOptions(builder.Configuration);

            optionsBuilder?.Invoke(messageBrokerOptionsBuilder);
            MessageBrokerOptions options = messageBrokerOptionsBuilder.Build();

            builder.Services.AddSingleton <IMessagingInfrastructureProvider, MessagingInfrastructureProvider>();

            builder.Services.Replace <IExternalDispatcher, BrokeredMessageDispatcher>(ServiceLifetime.Scoped);
            builder.Services.AddScoped <IBrokeredMessageReceiverFactory, BrokeredMessageReceiverFactory>();
            builder.Services.AddScoped <IBrokeredMessageDispatcher, BrokeredMessageDispatcher>();
            builder.Services.AddIfNotRegistered <IBrokeredMessagePathBuilder, DefaultBrokeredMessagePathBuilder>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IBrokeredMessageAttributeDetailProvider, BrokeredMessageAttributeProvider>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <ICircuitBreaker, CircuitBreaker>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <ICircuitBreakerStateStore, InMemoryCircuitBreakerStateStore>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <IMaxReceivesExceededAction, ErrorQueueDispatcher>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IRetryDelayStrategy, NoDelayRetry>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <ICriticalFailureNotifier, CriticalFailureEventDispatcher>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <IMessageIdGenerator, GuidIdGenerator>(ServiceLifetime.Scoped);

            builder.Services.AddScoped <IForwardMessages, ForwardingRouter>();
            builder.Services.AddScoped <IReplyRouter, ReplyRouter>();

            builder.Services.AddScoped <IOutboxProcessor, OutboxProcessor>();
            builder.Services.AddIfNotRegistered <IBrokeredMessageOutbox, InMemoryBrokeredMessageOutbox>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IBrokeredMessageInbox, InMemoryBrokeredMessageInbox>(ServiceLifetime.Scoped);
            builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, DefaultExceptionsPredicateProvider>();
            builder.Services.AddSingleton <IRetryExceptionEvaluator, RetryExceptionEvaluator>();
            builder.Services.AddSingleton <ICircuitBreakerExceptionEvaluator, CircuitBreakerExceptionEvaluator>();
            builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, DefaultExceptionsPredicateProvider>();
            builder.Services.AddScoped <IRetryStrategy, RetryStrategy>();
            builder.Services.AddScoped <IRecoveryStrategy, RetryWithCircuitBreakerStrategy>();
            builder.Services.AddScoped <IReceivedMessageDispatcher, ScopedReceivedMessageDispatcher>();

            if (options?.Reliability?.EnableOutboxPollingProcessor ?? false)
            {
                builder.Services.AddHostedService <BrokeredMessageOutboxProcessor>();
            }

            if (options?.Reliability?.RouteMessagesToOutbox ?? false)
            {
                builder.Services.AddIfNotRegistered <IRouteBrokeredMessages, OutboxBrokeredMessageRouter>(ServiceLifetime.Scoped);
            }
            else
            {
                builder.Services.AddIfNotRegistered <IRouteBrokeredMessages, BrokeredMessageRouter>(ServiceLifetime.Scoped);
            }

            builder.AddAllReceivers(assemblies);

            builder.Services.AddScoped <IBodyConverterFactory, BodyConverterFactory>();
            builder.Services.AddScoped <IBrokeredMessageBodyConverter, TextPlainBodyConverter>();
            builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonBodyConverter>();

            return(builder);
        }
Exemplo n.º 21
0
 public static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <CommandPipelineBuilder> pipelineBulder)
 => CqrsExtensions.AddCommandPipeline(chatterBuilder, pipelineBulder);