Beispiel #1
0
        public PipelineRunBuilder(
            [NotNull] BusSettings busSettings,
            [NotNull] IPipelineBuilder pipelineBuilder,
            [NotNull] IOuterPipelineDetertorUpdater updater,
            [NotNull] IDependencyScope dependencyScope)
        {
            if (pipelineBuilder == null)
            {
                throw new ArgumentNullException(nameof(pipelineBuilder));
            }
            if (updater == null)
            {
                throw new ArgumentNullException(nameof(updater));
            }
            if (dependencyScope == null)
            {
                throw new ArgumentNullException(nameof(dependencyScope));
            }
            if (busSettings == null)
            {
                throw new ArgumentNullException(nameof(busSettings));
            }

            this.pipelineBuilder = pipelineBuilder;
            this.updater         = updater;
            this.dependencyScope = dependencyScope;
            this.busSettings     = busSettings;
        }
		private static Func<IMessage, Task<object>> GenerateNext(
			BusSettings busSettings,
			IDependencyScope dependencyScope,
			IReadOnlyCollection<Type> pipelineHandlerTypes,
			IEnumerable<Type> leftHandlerTypes
			)
		{
			return (async message => {

				if (message == null) {
					throw new NullMessageTypeException();
				}

				if (!pipelineHandlerTypes.Any()) {
					return await RunLeafHandlers(busSettings, dependencyScope, leftHandlerTypes, message);
				}

				var head = pipelineHandlerTypes.First();
				var nextHandler = (IPipelineHandler)dependencyScope.GetService(head);

				var tail = pipelineHandlerTypes.Skip(1).ToList();
				var nextFunction = GenerateNext(busSettings, dependencyScope, tail, leftHandlerTypes);

				return await nextHandler.Handle(nextFunction, message);
			});
		}
 public PipelineRunBuilder(
     BusSettings busSettings,
     IPipelineBuilder pipelineBuilder,
     IOuterPipelineDetertorUpdater updater,
     IDependencyScope dependencyScope)
 {
     this.pipelineBuilder = pipelineBuilder ?? throw new ArgumentNullException(nameof(pipelineBuilder));
     this.updater         = updater ?? throw new ArgumentNullException(nameof(updater));
     this.dependencyScope = dependencyScope ?? throw new ArgumentNullException(nameof(dependencyScope));
     this.busSettings     = busSettings ?? throw new ArgumentNullException(nameof(busSettings));
 }
		public PipelineBuilder(
			[NotNull]BusSettings busSettings,
			[NotNull]IHandlerProvider handlerProvider,
			[NotNull]IGlobalPipelineProvider globalPipelineProvider,
			[NotNull]IGlobalPipelineTracker tracker,
			[NotNull]IDependencyScope dependencyScope)
		{
			if (handlerProvider == null) throw new ArgumentNullException(nameof(handlerProvider));
			if (globalPipelineProvider == null) throw new ArgumentNullException(nameof(globalPipelineProvider));
			if (tracker == null) throw new ArgumentNullException(nameof(tracker));
			if (dependencyScope == null) throw new ArgumentNullException(nameof(dependencyScope));
			if (busSettings == null) throw new ArgumentNullException(nameof(busSettings));

			this.handlerProvider = handlerProvider;
			this.globalPipelineProvider = globalPipelineProvider;
			this.tracker = tracker;
			this.dependencyScope = dependencyScope;
			this.busSettings = busSettings;
		}
		private static async Task<Result> RunLeafHandlers(
			BusSettings busSettings,
			IDependencyScope dependencyScope,
			IEnumerable<Type> leftHandlerTypes,
			IMessage message)
		{
			Task lastTask = null;
			var handlers = leftHandlerTypes.Select(dependencyScope.GetService);

			if (busSettings.DisableParallelHandlers) {
				foreach (var leafHandler in handlers) {
					await (lastTask = CallHandleOnHandler(leafHandler, message));
				}
			} else {
				await Task.WhenAll(handlers.Select(handler => (lastTask = CallHandleOnHandler(handler, message))));
			}

			if (lastTask == null) {
				throw new NullReferenceException("Sanity Check fail: while running leaf handlers the last task was null, but an instance was expected.");
			}

			return GetTaskResult(lastTask);
		}