// This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(configure =>
            {
                configure.Filters.Add(typeof(GlobalExceptionFilter));
            });

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAnyOrigin", builder => builder
                                  .AllowAnyOrigin()
                                  .AllowAnyMethod()
                                  .AllowAnyHeader());
            });

            services.AddDateTimeProvider();
            services.AddApplicationServices();

            var storageOptions       = new StorageOptions();
            var messageBrokerOptions = new MessageBrokerOptions();

            Configuration.GetSection("Storage").Bind(storageOptions);
            Configuration.GetSection("MessageBroker").Bind(messageBrokerOptions);

            services.AddStorageModule(storageOptions, messageBrokerOptions, Configuration.GetConnectionString("ClassifiedAds"));

            services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority            = Configuration["IdentityServerAuthentication:Authority"];
                options.ApiName              = Configuration["IdentityServerAuthentication.ApiName"];
                options.RequireHttpsMetadata = Configuration["IdentityServerAuthentication.RequireHttpsMetadata"] == "true";
            });
        }
Example #2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            if (string.Equals(Configuration["CheckDependency:Enabled"], "true", System.StringComparison.OrdinalIgnoreCase))
            {
                NetworkPortCheck.Wait(Configuration["CheckDependency:Host"], 5);
            }

            var messageBrokerOptions = new MessageBrokerOptions {
                Provider = "Fake"
            };

            services.AddAuditLogModule(Configuration["ConnectionStrings:ClassifiedAds"],
                                       typeof(Startup).GetTypeInfo().Assembly.GetName().Name)
            .AddIdentityModule(Configuration["ConnectionStrings:ClassifiedAds"],
                               typeof(Startup).GetTypeInfo().Assembly.GetName().Name)
            .AddNotificationModule(messageBrokerOptions, Configuration["ConnectionStrings:ClassifiedAds"],
                                   typeof(Startup).GetTypeInfo().Assembly.GetName().Name)
            .AddProductModule(Configuration["ConnectionStrings:ClassifiedAds"],
                              typeof(Startup).GetTypeInfo().Assembly.GetName().Name)
            .AddStorageModule(new StorageOptions(),
                              messageBrokerOptions,
                              Configuration["ConnectionStrings:ClassifiedAds"],
                              typeof(Startup).GetTypeInfo().Assembly.GetName().Name)
            .AddApplicationServices();

            services.AddIdentityServer()
            .AddTokenProviderModule(Configuration.GetConnectionString("ClassifiedAds"),
                                    typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
        }
Example #3
0
 public ActiveMQBroker(IOptions <MessageBrokerOptions> options)
 {
     this.syncLock                    = new object();
     this.serializationManager        = new JsonSerializationManager();
     this.messageBrokerOptions        = options.Value;
     this.serializationManager        = new JsonSerializationManager();
     this.connectionFactory           = new ConnectionFactory();
     this.connectionFactory.UserName  = this.messageBrokerOptions.MessageBrokerUsername;
     this.connectionFactory.Password  = this.messageBrokerOptions.MessageBrokerPassword;
     this.connectionFactory.BrokerUri = new Uri($"{this.messageBrokerOptions.MessageBrokerHost}");
 }
Example #4
0
 public ChangeFeedReceiver(IMessagingInfrastructureProvider infrastructureProvider,
                           MessageBrokerOptions messageBrokerOptions,
                           ILogger <BrokeredMessageReceiver <TProcessorCommand> > logger,
                           IServiceScopeFactory serviceFactory,
                           IMaxReceivesExceededAction recoveryAction,
                           ICriticalFailureNotifier criticalFailureNotifier,
                           IRecoveryStrategy recoveryStrategy,
                           IReceivedMessageDispatcher receivedMessageDispatcher)
     : base(infrastructureProvider, messageBrokerOptions, logger, recoveryAction, criticalFailureNotifier, recoveryStrategy, receivedMessageDispatcher)
 {
     _serviceFactory = serviceFactory ?? throw new ArgumentNullException(nameof(serviceFactory));
 }
Example #5
0
        public RabbitMQBroker(IOptions <MessageBrokerOptions> options)
        {
            this.syncLock             = new object();
            this.messageBrokerOptions = options.Value;
            this.serializationManager = new JsonSerializationManager();
            channels = new Dictionary <string, IModel>();

            this.connectionFactory = new ConnectionFactory();
            this.connectionFactory.AutomaticRecoveryEnabled = true;
            this.connectionFactory.UserName = this.messageBrokerOptions.MessageBrokerUsername;
            this.connectionFactory.Password = this.messageBrokerOptions.MessageBrokerPassword;
            this.connectionFactory.HostName = this.messageBrokerOptions.MessageBrokerHost;
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDateTimeProvider();
            services.AddApplicationServices();

            var messageBrokerOptions = new MessageBrokerOptions();
            var notificationOptions  = new NotificationOptions();

            Configuration.GetSection("MessageBroker").Bind(messageBrokerOptions);
            Configuration.GetSection("Notification").Bind(notificationOptions);

            services.AddNotificationModule(messageBrokerOptions, notificationOptions, Configuration.GetConnectionString("ClassifiedAds"));
        }
 public SqlServiceBrokerReceiver(SqlServiceBrokerOptions ssbOptions,
                                 MessageBrokerOptions messageBrokerOptions,
                                 ILogger <SqlServiceBrokerReceiver> logger,
                                 IBodyConverterFactory bodyConverterFactory,
                                 IServiceScopeFactory serviceFactory)
 {
     _ssbOptions                    = ssbOptions ?? throw new ArgumentNullException(nameof(ssbOptions));
     _logger                        = logger;
     _bodyConverterFactory          = bodyConverterFactory;
     _transactionMode               = messageBrokerOptions?.TransactionMode ?? TransactionMode.ReceiveOnly;
     _localReceiverDeliveryAttempts = new ConcurrentDictionary <Guid, int>();
     _serviceFactory                = serviceFactory;
 }
Example #8
0
        public ServiceBusReceiver(ServiceBusOptions serviceBusOptions,
                                  MessageBrokerOptions messageBrokerOptions,
                                  ILogger <ServiceBusReceiver> logger,
                                  IBodyConverterFactory bodyConverterFactory)
        {
            if (serviceBusOptions is null)
            {
                throw new ArgumentNullException(nameof(serviceBusOptions));
            }

            _syncLock = new object();
            ServiceBusConnectionBuilder = new ServiceBusConnectionStringBuilder(serviceBusOptions.ConnectionString);
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _bodyConverterFactory = bodyConverterFactory ?? throw new ArgumentNullException(nameof(bodyConverterFactory));
            _tokenProvider        = serviceBusOptions.TokenProvider;
            _retryPolcy           = serviceBusOptions.Policy;
            _prefetchCount        = serviceBusOptions.PrefetchCount;
            _receiveMode          = messageBrokerOptions?.TransactionMode == TransactionMode.None ? ReceiveMode.ReceiveAndDelete : ReceiveMode.PeekLock;
        }
        /// <summary>
        /// Creates a brokered message receiver that receives messages of <typeparamref name="TMessage"/>
        /// </summary>
        /// <param name="infrastructureProvider">The message broker infrastructure</param>
        /// <param name="serviceFactory">The service scope factory used to create a new scope when a message is received from the messaging infrastructure.</param>
        /// <param name="logger">Provides logging capability</param>
        public BrokeredMessageReceiver(IMessagingInfrastructureProvider infrastructureProvider,
                                       MessageBrokerOptions messageBrokerOptions,
                                       ILogger <BrokeredMessageReceiver <TMessage> > logger,
                                       IMaxReceivesExceededAction recoveryAction,
                                       ICriticalFailureNotifier criticalFailureNotifier,
                                       IRecoveryStrategy recoveryStrategy,
                                       IReceivedMessageDispatcher receivedMessageDispatcher)
        {
            if (infrastructureProvider is null)
            {
                throw new ArgumentNullException(nameof(infrastructureProvider));
            }

            _infrastructureProvider = infrastructureProvider;
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _failedRecoveryAction      = recoveryAction;
            _criticalFailureNotifier   = criticalFailureNotifier ?? throw new ArgumentNullException(nameof(criticalFailureNotifier));
            _messageBrokerOptions      = messageBrokerOptions ?? throw new ArgumentNullException(nameof(messageBrokerOptions));
            _recoveryStrategy          = recoveryStrategy ?? throw new ArgumentNullException(nameof(recoveryStrategy));
            _receivedMessageDispatcher = receivedMessageDispatcher ?? throw new ArgumentNullException(nameof(receivedMessageDispatcher));
        }
        /// <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);
        }
Example #11
0
        public static IServiceCollection AddNotificationModule(this IServiceCollection services, MessageBrokerOptions messageBrokerOptions, NotificationOptions notificationOptions, string connectionString, string migrationsAssembly = "")
        {
            services
            .AddDbContext <NotificationDbContext>(options => options.UseSqlServer(connectionString, sql =>
            {
                if (!string.IsNullOrEmpty(migrationsAssembly))
                {
                    sql.MigrationsAssembly(migrationsAssembly);
                }
            }))
            .AddScoped <IRepository <EmailMessage, Guid>, Repository <EmailMessage, Guid> >()
            .AddScoped <IRepository <SmsMessage, Guid>, Repository <SmsMessage, Guid> >()
            .AddScoped(typeof(IEmailMessageRepository), typeof(EmailMessageRepository))
            .AddScoped(typeof(ISmsMessageRepository), typeof(SmsMessageRepository))
            .AddScoped <IEmailMessageService, EmailMessageService>();

            services
            .AddScoped <EmailMessageService>()
            .AddScoped <SmsMessageService>();

            DomainEvents.RegisterHandlers(Assembly.GetExecutingAssembly(), services);

            services.AddMessageHandlers(Assembly.GetExecutingAssembly());

            services
            .AddMessageBusSender <EmailMessageCreatedEvent>(messageBrokerOptions)
            .AddMessageBusSender <SmsMessageCreatedEvent>(messageBrokerOptions);

            services.AddNotificationServices(notificationOptions);

            return(services);
        }
        public static IServiceCollection AddStorageModule(this IServiceCollection services, StorageOptions storageOptions, MessageBrokerOptions messageBrokerOptions, string connectionString, string migrationsAssembly = "")
        {
            services.AddDbContext <StorageDbContext>(options => options.UseSqlServer(connectionString, sql =>
            {
                if (!string.IsNullOrEmpty(migrationsAssembly))
                {
                    sql.MigrationsAssembly(migrationsAssembly);
                }
            }))
            .AddScoped <IRepository <FileEntry, Guid>, Repository <FileEntry, Guid> >();

            DomainEvents.RegisterHandlers(Assembly.GetExecutingAssembly(), services);

            services.AddMessageHandlers(Assembly.GetExecutingAssembly());

            if (storageOptions.UsedAzure())
            {
                services.AddSingleton <IFileStorageManager>(new AzureBlobStorageManager(storageOptions.Azure.ConnectionString, storageOptions.Azure.Container));
            }
            else if (storageOptions.UsedAmazon())
            {
                services.AddSingleton <IFileStorageManager>(
                    new AmazonS3StorageManager(
                        storageOptions.Amazon.AccessKeyID,
                        storageOptions.Amazon.SecretAccessKey,
                        storageOptions.Amazon.BucketName,
                        storageOptions.Amazon.RegionEndpoint));
            }
            else
            {
                services.AddSingleton <IFileStorageManager>(new LocalFileStorageManager(storageOptions.Local.Path));
            }

            if (messageBrokerOptions.UsedRabbitMQ())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new RabbitMQSender <FileUploadedEvent>(new RabbitMQSenderOptions
                {
                    HostName     = messageBrokerOptions.RabbitMQ.HostName,
                    UserName     = messageBrokerOptions.RabbitMQ.UserName,
                    Password     = messageBrokerOptions.RabbitMQ.Password,
                    ExchangeName = messageBrokerOptions.RabbitMQ.ExchangeName,
                    RoutingKey   = messageBrokerOptions.RabbitMQ.RoutingKey_FileUploaded,
                }));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new RabbitMQSender <FileDeletedEvent>(new RabbitMQSenderOptions
                {
                    HostName     = messageBrokerOptions.RabbitMQ.HostName,
                    UserName     = messageBrokerOptions.RabbitMQ.UserName,
                    Password     = messageBrokerOptions.RabbitMQ.Password,
                    ExchangeName = messageBrokerOptions.RabbitMQ.ExchangeName,
                    RoutingKey   = messageBrokerOptions.RabbitMQ.RoutingKey_FileDeleted,
                }));
            }
            else if (messageBrokerOptions.UsedKafka())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new KafkaSender <FileUploadedEvent>(
                                                                                messageBrokerOptions.Kafka.BootstrapServers,
                                                                                messageBrokerOptions.Kafka.Topic_FileUploaded));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new KafkaSender <FileDeletedEvent>(
                                                                               messageBrokerOptions.Kafka.BootstrapServers,
                                                                               messageBrokerOptions.Kafka.Topic_FileDeleted));
            }
            else if (messageBrokerOptions.UsedAzureQueue())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new AzureQueueSender <FileUploadedEvent>(
                                                                                connectionString: messageBrokerOptions.AzureQueue.ConnectionString,
                                                                                queueName: messageBrokerOptions.AzureQueue.QueueName_FileUploaded));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new AzureQueueSender <FileDeletedEvent>(
                                                                               connectionString: messageBrokerOptions.AzureQueue.ConnectionString,
                                                                               queueName: messageBrokerOptions.AzureQueue.QueueName_FileDeleted));
            }
            else if (messageBrokerOptions.UsedAzureServiceBus())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new AzureServiceBusSender <FileUploadedEvent>(
                                                                                connectionString: messageBrokerOptions.AzureServiceBus.ConnectionString,
                                                                                queueName: messageBrokerOptions.AzureServiceBus.QueueName_FileUploaded));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new AzureServiceBusSender <FileDeletedEvent>(
                                                                               connectionString: messageBrokerOptions.AzureServiceBus.ConnectionString,
                                                                               queueName: messageBrokerOptions.AzureServiceBus.QueueName_FileDeleted));
            }
            else if (messageBrokerOptions.UsedAzureEventGrid())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new AzureEventGridSender <FileUploadedEvent>(
                                                                                messageBrokerOptions.AzureEventGrid.DomainEndpoint,
                                                                                messageBrokerOptions.AzureEventGrid.DomainKey,
                                                                                messageBrokerOptions.AzureEventGrid.Topic_FileUploaded));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new AzureEventGridSender <FileDeletedEvent>(
                                                                               messageBrokerOptions.AzureEventGrid.DomainEndpoint,
                                                                               messageBrokerOptions.AzureEventGrid.DomainKey,
                                                                               messageBrokerOptions.AzureEventGrid.Topic_FileDeleted));
            }
            else if (messageBrokerOptions.UsedAzureEventHub())
            {
                services.AddSingleton <IMessageSender <FileUploadedEvent> >(new AzureEventHubSender <FileUploadedEvent>(
                                                                                messageBrokerOptions.AzureEventHub.ConnectionString,
                                                                                messageBrokerOptions.AzureEventHub.Hub_FileUploaded));

                services.AddSingleton <IMessageSender <FileDeletedEvent> >(new AzureEventHubSender <FileDeletedEvent>(
                                                                               messageBrokerOptions.AzureEventHub.ConnectionString,
                                                                               messageBrokerOptions.AzureEventHub.Hub_FileDeleted));
            }

            return(services);
        }
        public static IServiceCollection AddStorageModule(this IServiceCollection services, StorageOptions storageOptions, MessageBrokerOptions messageBrokerOptions, string connectionString, string migrationsAssembly = "")
        {
            services.AddDbContext <StorageDbContext>(options => options.UseSqlServer(connectionString, sql =>
            {
                if (!string.IsNullOrEmpty(migrationsAssembly))
                {
                    sql.MigrationsAssembly(migrationsAssembly);
                }
            }))
            .AddScoped <IRepository <FileEntry, Guid>, Repository <FileEntry, Guid> >();

            DomainEvents.RegisterHandlers(Assembly.GetExecutingAssembly(), services);

            services.AddMessageHandlers(Assembly.GetExecutingAssembly());

            if (storageOptions.UsedAzure())
            {
                services.AddSingleton <IFileStorageManager>(new AzureBlobStorageManager(storageOptions.Azure.ConnectionString, storageOptions.Azure.Container));
            }
            else if (storageOptions.UsedAmazon())
            {
                services.AddSingleton <IFileStorageManager>(
                    new AmazonS3StorageManager(
                        storageOptions.Amazon.AccessKeyID,
                        storageOptions.Amazon.SecretAccessKey,
                        storageOptions.Amazon.BucketName,
                        storageOptions.Amazon.RegionEndpoint));
            }
            else if (storageOptions.UsedLocal())
            {
                services.AddSingleton <IFileStorageManager>(new LocalFileStorageManager(storageOptions.Local.Path));
            }
            else if (storageOptions.UsedFake())
            {
                services.AddSingleton <IFileStorageManager>(new FakeStorageManager());
            }

            services.AddMessageBusSender <FileUploadedEvent>(messageBrokerOptions);
            services.AddMessageBusSender <FileDeletedEvent>(messageBrokerOptions);

            return(services);
        }
        public static IServiceCollection AddMessageBusReceiver <T>(this IServiceCollection services, MessageBrokerOptions options)
        {
            if (options.UsedRabbitMQ())
            {
                services.AddRabbitMQReceiver <T>(options.RabbitMQ);
            }
            else if (options.UsedKafka())
            {
                services.AddKafkaReceiver <T>(options.Kafka);
            }
            else if (options.UsedAzureQueue())
            {
                services.AddAzureQueueReceiver <T>(options.AzureQueue);
            }
            else if (options.UsedAzureServiceBus())
            {
                services.AddAzureServiceBusReceiver <T>(options.AzureServiceBus);
            }
            else if (options.UsedAzureEventHub())
            {
                services.AddAzureEventHubReceiver <T>(options.AzureEventHub);
            }
            else if (options.UsedFake())
            {
                services.AddFakeReceiver <T>();
            }

            return(services);
        }
        public static IServiceCollection AddMessageBusSender <T>(this IServiceCollection services, MessageBrokerOptions options, IHealthChecksBuilder healthChecksBuilder = null, HashSet <string> checkDulicated = null)
        {
            if (options.UsedRabbitMQ())
            {
                services.AddRabbitMQSender <T>(options.RabbitMQ);

                if (healthChecksBuilder != null)
                {
                    var name = "Message Broker (RabbitMQ)";

                    if (checkDulicated == null || !checkDulicated.Contains(name))
                    {
                        healthChecksBuilder.AddRabbitMQ(
                            rabbitMQConnectionString: options.RabbitMQ.ConnectionString,
                            name: name,
                            failureStatus: HealthStatus.Degraded);
                    }

                    checkDulicated?.Add(name);
                }
            }
            else if (options.UsedKafka())
            {
                services.AddKafkaSender <T>(options.Kafka);

                if (healthChecksBuilder != null)
                {
                    var name = "Message Broker (Kafka)";

                    if (checkDulicated == null || !checkDulicated.Contains(name))
                    {
                        healthChecksBuilder.AddKafka(
                            setup =>
                        {
                            setup.BootstrapServers = options.Kafka.BootstrapServers;
                            setup.MessageTimeoutMs = 5000;
                        },
                            name: name,
                            failureStatus: HealthStatus.Degraded);
                    }

                    checkDulicated?.Add(name);
                }
            }
            else if (options.UsedAzureQueue())
            {
                services.AddAzureQueueSender <T>(options.AzureQueue);

                if (healthChecksBuilder != null)
                {
                    healthChecksBuilder.AddAzureQueueStorage(connectionString: options.AzureQueue.ConnectionString,
                                                             queueName: options.AzureQueue.QueueNames[typeof(T).Name],
                                                             name: $"Message Broker (Azure Queue) {typeof(T).Name}",
                                                             failureStatus: HealthStatus.Degraded);
                }
            }
            else if (options.UsedAzureServiceBus())
            {
                services.AddAzureServiceBusSender <T>(options.AzureServiceBus);

                if (healthChecksBuilder != null)
                {
                    healthChecksBuilder.AddAzureServiceBusQueue(
                        connectionString: options.AzureServiceBus.ConnectionString,
                        queueName: options.AzureServiceBus.QueueNames[typeof(T).Name],
                        name: $"Message Broker (Azure Service Bus) {typeof(T).Name}",
                        failureStatus: HealthStatus.Degraded);
                }
            }
            else if (options.UsedAzureEventGrid())
            {
                services.AddAzureEventGridSender <T>(options.AzureEventGrid);

                // TODO: Add Health Check
            }
            else if (options.UsedAzureEventHub())
            {
                services.AddAzureEventHubSender <T>(options.AzureEventHub);

                // TODO: Add Health Check
            }
            else if (options.UsedFake())
            {
                services.AddFakeSender <T>();
            }

            return(services);
        }
        public static IServiceCollection AddMessageBusReceiver <T>(this IServiceCollection services, MessageBrokerOptions options)
        {
            services.AddKafkaReceiver <T>(options.Kafka);

            return(services);
        }
Example #17
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            if (string.Equals(Configuration["CheckDependency:Enabled"], "true", System.StringComparison.OrdinalIgnoreCase))
            {
                NetworkPortCheck.Wait(Configuration["CheckDependency:Host"], 5);
            }

            services.AddDateTimeProvider();

            var messageBrokerOptions = new MessageBrokerOptions
            {
                Provider = "Fake",
            };

            var notificationOptions = new NotificationOptions
            {
                Email = new EmailOptions {
                    Provider = "Fake"
                },
                Sms = new SmsOptions {
                    Provider = "Fake"
                },
                Web = new WebOptions {
                    Provider = "Fake"
                },
            };

            services.AddAuditLogModule(new Modules.AuditLog.ConfigurationOptions.AuditLogModuleOptions
            {
                ConnectionStrings = new Modules.AuditLog.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
            })
            .AddConfigurationModule(new ConfigurationModuleOptions
            {
                ConnectionStrings = new Modules.Configuration.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
            })
            .AddIdentityModule(new IdentityModuleOptions
            {
                ConnectionStrings = new Modules.Identity.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
            })
            .AddNotificationModule(new Modules.Notification.ConfigurationOptions.NotificationModuleOptions
            {
                ConnectionStrings = new Modules.Notification.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
                MessageBroker = messageBrokerOptions,
                Notification  = notificationOptions,
            })
            .AddProductModule(new Modules.Product.ConfigurationOptions.ProductModuleOptions
            {
                ConnectionStrings = new Modules.Product.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
            })
            .AddStorageModule(new Modules.Storage.ConfigurationOptions.StorageModuleOptions
            {
                ConnectionStrings = new Modules.Storage.ConfigurationOptions.ConnectionStringsOptions
                {
                    Default            = Configuration["ConnectionStrings:ClassifiedAds"],
                    MigrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name,
                },
                Storage       = new StorageOptions(),
                MessageBroker = messageBrokerOptions,
            })
            .AddApplicationServices();

            services.AddIdentityServer()
            .AddTokenProviderModule(Configuration.GetConnectionString("ClassifiedAds"),
                                    typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
        }
Example #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="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);
        }
Example #19
0
        public static IServiceCollection AddStorageModule(this IServiceCollection services, StorageOptions storageOptions, MessageBrokerOptions messageBrokerOptions, string connectionString, string migrationsAssembly = "")
        {
            services.AddDbContext <StorageDbContext>(options => options.UseSqlServer(connectionString, sql =>
            {
                if (!string.IsNullOrEmpty(migrationsAssembly))
                {
                    sql.MigrationsAssembly(migrationsAssembly);
                }
            }))
            .AddScoped <IRepository <FileEntry, Guid>, Repository <FileEntry, Guid> >();

            DomainEvents.RegisterHandlers(Assembly.GetExecutingAssembly(), services);

            services.AddMessageHandlers(Assembly.GetExecutingAssembly());

            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped <ICurrentUser, CurrentWebUser>();

            services.AddStorageManager(storageOptions);

            services.AddMessageBusSender <FileUploadedEvent>(messageBrokerOptions)
            .AddMessageBusSender <FileDeletedEvent>(messageBrokerOptions)
            .AddMessageBusReceiver <FileUploadedEvent>(messageBrokerOptions)
            .AddMessageBusReceiver <FileDeletedEvent>(messageBrokerOptions);

            return(services);
        }
Example #20
0
        public static IServiceCollection AddMessageBusSender <TKey, TValue>(this IServiceCollection services, MessageBrokerOptions options)
        {
            switch (options.Provider)
            {
            case "RabbitMQ":
                services.AddRabbitMQSender <TKey, TValue>(options.RabbitMQ);
                break;

            case "Kafka":
                services.AddKafkaSender <TKey, TValue>(options.Kafka);
                break;

            case "AzureQueue":
                services.AddAzureQueueSender <TKey, TValue>(options.AzureQueue);
                break;

            case "AzureServiceBus":
                services.AddAzureServiceBusSender <TKey, TValue>(options.AzureServiceBus);
                break;

            case "AzureEventHub":
                services.AddAzureEventHubSender <TKey, TValue>(options.AzureEventHub);
                break;

            case "Fake":
                services.AddFakeSender <TKey, TValue>();
                break;
            }

            return(services);
        }