public static MicroserviceFrameworkBuilder UseEventBusRabbitMQ(this MicroserviceFrameworkBuilder builder, IConfiguration configuration) { builder.RegisterEventHandlers(); builder.Services.Configure <RabbitMQOptions>(configuration.GetSection("RabbitMQ")); builder.Services.AddSingleton <PersistentConnection>(); builder.Services.AddSingleton <IEventExecutor, DefaultEventExecutor>(); builder.Services.AddSingleton <IConnectionFactory>(provider => { var opts = provider.GetRequiredService <IOptionsMonitor <RabbitMQOptions> >().CurrentValue; var connectionFactory = new ConnectionFactory { HostName = opts.HostName, DispatchConsumersAsync = true }; if (opts.Port > 0) { connectionFactory.Port = opts.Port; } if (!string.IsNullOrWhiteSpace(opts.UserName)) { connectionFactory.UserName = opts.UserName; } if (!string.IsNullOrWhiteSpace(opts.Password)) { connectionFactory.Password = opts.Password; } return(connectionFactory); }); builder.Services.AddSingleton <IEventBus>((services) => { var connection = services.GetRequiredService <PersistentConnection>(); var eventExecutor = services.GetRequiredService <IEventExecutor>(); var logger = services.GetRequiredService <ILogger <EventBusRabbitMQ> >(); var eventBus = new EventBusRabbitMQ(services.GetRequiredService <IOptionsMonitor <RabbitMQOptions> >(), connection, eventExecutor, logger); eventBus.SubscribeAllEventTypes(); return(eventBus); }); return(builder); }