using System; using System.Collections.Generic; using System.Threading.Tasks; using NLog; using Perfusion; namespace JetKarmaBot.Services.Handling { public interface IRequestHandler { Task Handle(RequestContext ctx, Func next); } public class RequestChain : IRequestHandler { [Inject] private Logger log; List handlerStack = new List(); public async Task Handle(RequestContext ctx, Func next = null) { int i = 0; Func chainNext = null; chainNext = (newCtx) => { if (i == handlerStack.Count) { log.ConditionalTrace("(next) End of request chain"); return Task.CompletedTask; } IRequestHandler handler = handlerStack[i++]; log.ConditionalTrace($"(next) Executing handler {handler.GetType().Name}"); return handler.Handle(newCtx, chainNext); }; await chainNext(ctx); if (next != null) await next(ctx); } public void Add(IRequestHandler handler) { log.ConditionalTrace($"Adding {handler.GetType().Name} to reqchain"); handlerStack.Add(handler); } } }