public async Task HandlerWithoutMiddlewaresExecutionAsync() { #region Arrange var services = new ServiceCollection(); var registrator = new MiddlewareRegistrator(); var executor = new MiddlewareExecutor(registrator, services.BuildServiceProvider()); #endregion Arrange #region Act var acknowledgement = await executor.ExecuteAsync( typeof(TestHandler), new MessageContext <TestMessageDto>(new TestMessageDto(), new MqMessageData())); #endregion Act #region Assert Assert.Multiple(() => { Assert.IsInstanceOf <Ack>(acknowledgement); }); #endregion Assert }
public async Task ChecksShortCircuitMiddlewareExecutionAsync() { #region Arrange var services = new ServiceCollection(); var registrator = new MiddlewareRegistrator(); var messageMiddlewareRegistrator = registrator.AddFor <TestHandler, TestMessageDto>() .Add <ShortCircuitMiddleware>(); var executor = new MiddlewareExecutor(registrator, services.BuildServiceProvider()); #endregion Arrange #region Act var acknowledgement = await executor.ExecuteAsync( typeof(TestHandler), new MessageContext <TestMessageDto>(new TestMessageDto(), new MqMessageData())); #endregion Act #region Assert Assert.Multiple(() => { Assert.IsInstanceOf <Reject>(acknowledgement); Assert.AreEqual("stop", (acknowledgement as Reject)?.Reason); Assert.AreEqual(typeof(TestMessageDto), messageMiddlewareRegistrator.MessageType); }); #endregion Assert }
public static IServiceCollection AddRabbitMq( this IServiceCollection services, Action <RabbitMqRegistrationOptions>?options = null ) { var middlewareRegistrator = new MiddlewareRegistrator(); services.AddSingleton <IMiddlewareRegistryAccessor>(middlewareRegistrator); services.AddSingleton <IRuntimeMiddlewareRegistrator>(middlewareRegistrator); services.AddSingleton <ConsumerRegistry>(); services.AddSingleton <IConsumerRegistry>(sp => sp.GetRequiredService <ConsumerRegistry>()); services.AddSingleton <IConsumerRegistryAccessor>(sp => sp.GetRequiredService <ConsumerRegistry>()); services.AddHostedService <RabbitMqSubscribersStarter>(); var subscriberRegistrator = services.AddNamed <string, ISubscriber>(ServiceLifetime.Singleton) .Add <DefaultSubscriber>(); var acknowledgementRegistrator = services.AddNamed <string, IAcknowledgementBehaviour>(ServiceLifetime.Singleton) .Add <DefaultAcknowledgementBehaviour>(); var retryDelayComputerRegistrator = services.AddNamed <string, IRetryDelayComputer>(ServiceLifetime.Singleton) .Add <ConstantRetryDelayComputer>(RetryPolicyType.Constant) .Add <ExponentialRetryDelayComputer>(RetryPolicyType.Exponential) .Add <LinearRetryDelayComputer>(RetryPolicyType.Linear); var routeProviderRegistrator = services.AddNamed <string, IRouteProvider>(ServiceLifetime.Singleton) .Add <DefaultRouteProvider>(); var rabbitMqRegistrationOptions = new RabbitMqRegistrationOptions( middlewareRegistrator, subscriberRegistrator, acknowledgementRegistrator, retryDelayComputerRegistrator, routeProviderRegistrator ); options?.Invoke(rabbitMqRegistrationOptions); services.AddSingleton(sp => new RabbitMqHandlerAutoRegistrator( sp, rabbitMqRegistrationOptions.Assemblies, rabbitMqRegistrationOptions.TypeFilter )); return(services .AddConnectionServices(rabbitMqRegistrationOptions) .AddSubscribers(rabbitMqRegistrationOptions) .AddConfigurations(rabbitMqRegistrationOptions) .AddSerializers(rabbitMqRegistrationOptions) .AddPublishers(rabbitMqRegistrationOptions)); }
public async Task ChecksGeneralMiddlewareExecutionPipelineAsync() { #region Arrange var services = new ServiceCollection(); var registrator = new MiddlewareRegistrator(); registrator.AddFor <TestHandler, TestMessageDto>().Add <TestMiddleware>(); var sp = services.BuildServiceProvider(); var executor = new MiddlewareExecutor(registrator, sp); var testMessageDto = new TestMessageDto(); #endregion Arrange #region Act var acknowledgement = await executor.ExecuteAsync( typeof(TestHandler), new MessageContext <TestMessageDto>(testMessageDto, new MqMessageData())); #endregion Act #region Assert Assert.Multiple(() => { var middleware = sp.GetService <TestMiddleware>(); Assert.IsNull(middleware, "Middleware не должен быть в DI."); Assert.IsNotNull(testMessageDto.HandlerExecutedAt, "Handler не был выполнен."); Assert.IsNotNull(testMessageDto.MiddlewareExecutedAt, "Middleware не был выполнен."); Assert.IsTrue(testMessageDto.MiddlewareExecutedAt < testMessageDto.HandlerExecutedAt, "Middleware должен выполниться раньше, чем хендер."); Assert.IsInstanceOf <Ack>(acknowledgement); }); #endregion Assert }