using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class AsyncHandlerInitialization(IMessenger messenger, IServiceProvider provider) : IInitialization where THandler : class, IAsyncHandler where TMessage : class { public void Initialize() { if (!messenger.IsRegistered>(provider)) { messenger.Register>(provider, (provider, args) => { IEnumerable> handlers = provider.GetServices>(); IEnumerable> behaviors = provider.GetServices>(); foreach (IAsyncHandler handler in handlers) { Task ExecutePipeline(int index) =>index < 0 ? handler.Handle(args.Message, args.CancellationToken) : behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1)); args.Reply(ExecutePipeline(behaviors.Count() - 1)); } }); } } } public class AsyncHandlerInitialization(IMessenger messenger, IServiceProvider provider) : IInitialization where THandler : class, IAsyncHandler where TMessage : class { public void Initialize() { if (!messenger.IsRegistered>(provider)) { messenger.Register>(provider, (provider, args) => { IEnumerable> handlers = provider.GetServices>(); IEnumerable> behaviors = provider.GetServices>(); foreach (IAsyncHandler handler in handlers) { Task ExecutePipeline(int index) => index < 0 ? handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value) : behaviors.ElementAt(index).Handle(args.Message, () => ExecutePipeline(index - 1)).ContinueWith(_ => Unit.Value); args.Reply(ExecutePipeline(behaviors.Count() - 1)); } }); } } }