Пример #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 void Middleware(params Middleware<State>[] middlewares)
 {
     this.middlewares =
         middlewares.Select(m => m(store))
             .Reverse()
             .Aggregate<MiddlewareChainer, MiddlewareExecutor>(store.Dispatch, (acc, middle) => middle(acc));
 }
Пример #3
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
        }
Пример #4
0
        public MessageProducer(
            IDependencyResolver dependencyResolver,
            ProducerConfiguration configuration)
        {
            this.configuration = configuration;

            this.producer = new ProducerBuilder <byte[], byte[]>(configuration.GetKafkaConfig()).Build();

            var middlewares = this.configuration.MiddlewareConfiguration.Factories
                              .Select(factory => factory(dependencyResolver))
                              .ToList();

            this.middlewareExecutor = new MiddlewareExecutor(middlewares);
        }
Пример #5
0
        public MessageProducer(
            IDependencyResolver dependencyResolver,
            ProducerConfiguration configuration)
        {
            this.configuration = configuration;

            // Create middlewares instances inside a scope to allow scoped injections in producer middlewares
            this.dependencyResolverScope = dependencyResolver.CreateScope();

            var middlewares = this.configuration.MiddlewareConfiguration.Factories
                              .Select(factory => factory(this.dependencyResolverScope.Resolver))
                              .ToList();

            this.middlewareExecutor = new MiddlewareExecutor(middlewares);
        }
Пример #6
0
 /// <summary>
 /// 初始化继承一些父类的私有元素
 /// </summary>
 private void init()
 {
     actionListenersDict = new ConcurrentDictionary <string, Action <T, IAction> >();
     UnityIocService.AssertIsFirstInject(GetType());
     if (baseStore == null)
     {
         baseStore = this.GetPrivateField <object>("store", GetType().BaseType);
     }
     if (rootReducer == null)
     {
         rootReducer = baseStore.GetPrivateField <Reducer <T> >("rootReducer");
     }
     if (state == null)
     {
         state = baseStore.GetPrivateField <T>("state");
     }
     if (middlewares == null)
     {
         middlewares = this.GetPrivateField <MiddlewareExecutor>("middlewares");
     }
 }
Пример #7
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
        }
 /// <summary>
 /// Добавляем обработчик, который вызывается до срабатывания эвента, экшена или стейт машины.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="externalServices"></param>
 public static void AddMiddleware <T>(this IServiceCollection externalServices)
 {
     MiddlewareExecutor.AddMiddleware(typeof(T));
 }