예제 #1
0
        /// <summary>
        ///     Branches the message chain into multiple branches, where each has it's own handler or factory
        /// </summary>
        /// <typeparam name="TMessageType">The message type</typeparam>
        /// <param name="chainBuilder">The message handler chain builder</param>
        /// <param name="firstBranch">The first branch</param>
        /// <param name="branches">The other branch(es)</param>
        public static void Branch <TMessageType>(
            this IChainBuilder <TMessageType> chainBuilder,
            Action <IChainBuilder <TMessageType> > firstBranch,
            params Action <IChainBuilder <TMessageType> >[] branches)
        {
            if (firstBranch == null)
            {
                throw new ArgumentNullException(nameof(firstBranch));
            }

            chainBuilder.Handle(
                services =>
            {
                var allBranches = new List <Action <IChainBuilder <TMessageType> > >
                {
                    firstBranch
                };

                allBranches.AddRange(branches);

                var handler = new BranchHandler <TMessageType>(allBranches);
                services.BuilderNotifier.AddNotification(handler.ChainBuilt);
                return(handler.HandleMessageAsync);
            });
        }
예제 #2
0
        /// <summary>
        /// Branch Out one or more parallel branches, running in parallel with the main message handler
        /// </summary>
        /// <typeparam name="TMessageType">The message type</typeparam>
        /// <param name="chainBuilder">The message handler chain builder</param>
        /// <param name="branches">The branches</param>
        /// <returns>The message handler chain builder</returns>
        public static IChainBuilder <TMessageType> BranchOut <TMessageType>(
            this IChainBuilder <TMessageType> chainBuilder,
            params Action <IChainBuilder <TMessageType> >[] branches)
        {
            return(chainBuilder.Decorate(
                       (innerHandler, services) =>
            {
                var handler = new BranchHandler <TMessageType>(branches);
                services.BuilderNotifier.AddNotification(handler.ChainBuilt);
#pragma warning disable CC0031 // Check for null before calling a delegate
                return (message, token) => Task.WhenAll(handler.HandleMessageAsync(message, token), innerHandler(message, token));

#pragma warning restore CC0031 // Check for null before calling a delegate
            }));
        }