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 void Middleware(params Middleware<State>[] middlewares) { this.middlewares = middlewares.Select(m => m(store)) .Reverse() .Aggregate<MiddlewareChainer, MiddlewareExecutor>(store.Dispatch, (acc, middle) => middle(acc)); }
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 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); }
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); }
/// <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"); } }
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)); }