コード例 #1
0
        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
        }
コード例 #2
0
        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
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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
        }