/// <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); }); }
/// <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 })); }