Пример #1
0
        /// <summary>
        /// Add InMemory test harness. This can be reolved using <see cref="InMemoryTestHarness"/>.
        /// <br/>
        /// Ensure the InMemory transport has been added using
        /// <see cref="AddInMemoryTransport(EventBusBuilder, Action{InMemoryTransportOptions})"/>
        /// before resolving instances of <see cref="InMemoryTestHarness"/>.
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configure"></param>
        /// <returns></returns>
        public static EventBusBuilder AddInMemoryTestHarness(this EventBusBuilder builder,
                                                             Action <InMemoryTestHarnessOptions> configure = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var services = builder.Services;

            // configure the options for InMemory test harness
            if (configure != null)
            {
                services.Configure(configure);
            }

            // Register the harness
            services.AddSingleton <InMemoryTestHarness>();

            // Set the delivery delay to zero for instance delivery
            services.Configure <InMemoryTransportOptions>(o => o.DeliveryDelay = TimeSpan.Zero);
            services.AddSingleton <IPostConfigureOptions <InMemoryTestHarnessOptions>, InMemoryTestHarnessPostConfigureOptions>();

            return(builder);
        }
 public static EventBusBuilder AddEventHandler <TEvent, THandler>(this EventBusBuilder eventBusBuilder)
     where THandler : class, IIntegrationEventHandler <TEvent>
     where TEvent : IntegrationEvent
 {
     eventBusBuilder.Services.AddTransient <THandler>();
     return(eventBusBuilder);
 }
Пример #3
0
        private static IConfigurableEventBus CreateEventBus(EventBusBuilder eventBusBuilder, IServiceProvider serviceProvider)
        {
            var configuration     = serviceProvider.GetRequiredService <IConfiguration>();
            var section           = configuration.GetSection(eventBusBuilder.ConfigurationName);
            var eventBusType      = section["Type"].ToString();
            var subscriberManager = serviceProvider.GetRequiredService <SubscriberManager>();

            foreach (var eventHandlerInfo in eventBusBuilder.EventHandlers)
            {
                subscriberManager.Add(eventHandlerInfo);
            }

            if (eventBusType.Equals("RabbitMq", StringComparison.InvariantCultureIgnoreCase))
            {
                return(CreateRabbitMq(eventBusBuilder, serviceProvider, configuration, subscriberManager));
            }
            else if (eventBusType.Equals("ServiceBus", StringComparison.InvariantCultureIgnoreCase))
            {
                return(CreateServiceBus(eventBusBuilder, serviceProvider, subscriberManager));
            }
            else
            {
                throw new InvalidOperationException($"The Type '{eventBusType}' of EventBus configuration '{eventBusBuilder.ConfigurationName}' is invalid.");
            }
        }
Пример #4
0
        public static EventBusBuilder AddAsHostedService(this EventBusBuilder eventBusBuilder)
        {
            eventBusBuilder.Services.AddTransient <IHostedService, EventBusHostedService>(sp => new EventBusHostedService(eventBusBuilder.ConfigurationName,
                                                                                                                          sp.GetRequiredService <IEventBusFactory>(),
                                                                                                                          sp.GetRequiredService <ILoggerFactory>()));

            return(eventBusBuilder);
        }
Пример #5
0
        public static EventBusBuilder AddEventHandler<TEventHandler>(this EventBusBuilder eventBusBuilder)
                where TEventHandler : class, IRawEventHandler<byte[]>
        {
            eventBusBuilder.Services.AddTransient<TEventHandler>();
            eventBusBuilder.EventHandlers.Add(new SubscriberInfo(typeof(byte[]), typeof(TEventHandler)));

            return eventBusBuilder;
        }
Пример #6
0
 public static EventBusBuilder AddRabbitMq(this EventBusBuilder builder, Action <EventBusRabbitMqOptions> options = null)
 {
     builder.Service.AddSingleton <IMessagePublisher, RabbitMqMessagePublisher>();
     builder.Service.AddSingleton <IMessageSubscribe, RabbitMqMessageSubscribe>();
     if (options == null)
     {
         return(builder);
     }
     builder.Service.Configure(options);
     return(builder);
 }
        public static EventBusBuilder AddEventBus(this IServiceCollection services)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }
            services.TryAddSingleton <IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>();
            services.TryAddSingleton <IEventHandlerFactory, IocEventHandlerFactory>();
            var builder = new EventBusBuilder(services);

            return(builder);
        }
Пример #8
0
        private static IConfigurableEventBus CreateServiceBus(EventBusBuilder eventBusBuilder,
                                                              IServiceProvider serviceProvider,
                                                              SubscriberManager subscriberManager)
        {
            var connection = serviceProvider.GetServices <IServiceBusConnection>()
                             .Single(x => x.Name == eventBusBuilder.ConfigurationName);

            return(new ServiceBusEventBus(eventBusBuilder.ConfigurationName,
                                          connection,
                                          subscriberManager,
                                          serviceProvider,
                                          serviceProvider.GetRequiredService <ILoggerFactory>()));
        }
        public static IServiceCollection AddEventBus(this IServiceCollection services,
                                                     Action <IEventBusBuilder> setupAction)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            IEventBusBuilder builder = new EventBusBuilder(services)
                                       .UseJsonSerializer()
            ;

            setupAction?.Invoke(builder);

            return(services);
        }
Пример #10
0
        public static EventBusBuilder AddRabbitMq(this EventBusBuilder builder, Action <EventBusRabbitMqOptions> optionAction)
        {
            optionAction = optionAction ?? throw new AggregateException(nameof(optionAction));

            var option = new EventBusRabbitMqOptions();

            optionAction.Invoke(option);
            builder.Service.AddRabbitMq(options =>
            {
                options.Connection = option.RabbitMqConnection;
            });

            builder.Service.TryAddSingleton <IMessagePublisher, RabbitMqMessagePublisher>();
            builder.Service.TryAddSingleton <IMessageSubscribe, RabbitMqMessageSubscribe>();
            builder.Service.Configure(optionAction);
            return(builder);
        }
Пример #11
0
        public static IServiceCollection AddEventBus(this IServiceCollection services,
                                                     string configurationName,
                                                     Action <EventBusBuilder> eventBusBuilderAction)
        {
            var eventBusBuilder = new EventBusBuilder(configurationName, services);

            eventBusBuilderAction.Invoke(eventBusBuilder);

            return(services.AddTransient <SubscriberManager>()
                   .AddSingleton <IEventBusFactory, EventBusFactory>()
                   .AddSingleton(sp => CreateEventBus(eventBusBuilder, sp))

                   .AddSingleton <IRabbitMqConnection>(sp => new RabbitMqConnection(eventBusBuilder.ConfigurationName,
                                                                                    sp.GetRequiredService <IConfiguration>()))

                   .AddTransient <IServiceBusConnection>(sp => new ServiceBusConnection(eventBusBuilder.ConfigurationName,
                                                                                        sp.GetRequiredService <IConfiguration>(),
                                                                                        sp.GetRequiredService <ILoggerFactory>())));
        }
        /// <summary>
        /// Add Azure Queue Storage as the underlying transport for the Event Bus.
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="connectionString">
        /// The connection string to the Azure Storage account.
        /// Maps to <see cref="AzureQueueStorageTransportOptions.ConnectionString"/>.
        /// </param>
        /// <param name="configure"></param>
        /// <returns></returns>
        public static EventBusBuilder AddAzureQueueStorageTransport(this EventBusBuilder builder,
                                                                    string connectionString,
                                                                    Action <AzureQueueStorageTransportOptions> configure = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (string.IsNullOrWhiteSpace(connectionString))
            {
                throw new ArgumentException($"'{nameof(connectionString)}' cannot be null or whitespace", nameof(connectionString));
            }

            return(builder.AddAzureQueueStorageTransport(options =>
            {
                options.ConnectionString = connectionString;
                configure?.Invoke(options);
            }));
        }
        /// <summary>
        /// Add Azure Queue Storage as the underlying transport for the Event Bus.
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configure"></param>
        /// <returns></returns>
        public static EventBusBuilder AddAzureQueueStorageTransport(this EventBusBuilder builder, Action <AzureQueueStorageTransportOptions> configure)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (configure is null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            var services = builder.Services;

            // configure the options for Azure Queue Storage
            services.Configure(configure);
            services.AddSingleton <IPostConfigureOptions <AzureQueueStorageTransportOptions>, AzureQueueStoragePostConfigureOptions>();

            // register the transport
            builder.AddTransport <AzureQueueStorageTransport, AzureQueueStorageTransportOptions>();

            return(builder);
        }
Пример #14
0
        /// <summary>
        /// Add InMemory as the underlying transport for the Event Bus.
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configure"></param>
        /// <returns></returns>
        public static EventBusBuilder AddInMemoryTransport(this EventBusBuilder builder,
                                                           Action <InMemoryTransportOptions> configure = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var services = builder.Services;

            // configure the options for InMemory transport
            if (configure != null)
            {
                services.Configure(configure);
            }

            services.AddSingleton <SequenceNumberGenerator>();

            // register the transport
            builder.AddTransport <InMemoryTransport, InMemoryTransportOptions>();

            return(builder);
        }
 public static EventBusBuilder AddEventHandlers <TEvent, THandler0, THandler1, THandler2, THandler3>(this EventBusBuilder eventBusBuilder)
     where THandler0 : class, IIntegrationEventHandler <TEvent>
     where THandler1 : class, IIntegrationEventHandler <TEvent>
     where THandler2 : class, IIntegrationEventHandler <TEvent>
     where THandler3 : class, IIntegrationEventHandler <TEvent>
     where TEvent : IntegrationEvent
 {
     eventBusBuilder.Services.AddTransient <THandler0>();
     eventBusBuilder.Services.AddTransient <THandler1>();
     eventBusBuilder.Services.AddTransient <THandler2>();
     eventBusBuilder.Services.AddTransient <THandler3>();
     return(eventBusBuilder);
 }