using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class AsyncHandlerInitialization(IServiceProvider provider) : IInitialization where THandler : class, IAsyncHandler where TMessage : class { public void Initialize() { if (!StrongReferenceMessenger.Default.IsRegistered>(provider)) { StrongReferenceMessenger.Default.Register>(provider, (provider, args) => { IEnumerable> handlers = provider.GetServices>(); IEnumerable> behaviors = provider.GetServices>(); foreach (IAsyncHandler handler in handlers) { AsyncHandlerDelegate handlerDelegate = () => handler.Handle(args.Message, args.CancellationToken); foreach (IAsyncPipelineBehavior? behavior in behaviors.Reverse()) { AsyncHandlerDelegate next = handlerDelegate; handlerDelegate = () => behavior.Handle(args.Message, next); } args.Reply(handlerDelegate()); } }); } } } public class AsyncHandlerInitialization(IServiceProvider provider) : IInitialization where THandler : class, IAsyncHandler where TMessage : class { public void Initialize() { if (!StrongReferenceMessenger.Default.IsRegistered>(provider)) { StrongReferenceMessenger.Default.Register>(provider, (provider, args) => { IEnumerable> handlers = provider.GetServices>(); IEnumerable> behaviors = provider.GetServices>(); foreach (IAsyncHandler handler in handlers) { AsyncHandlerDelegate handlerDelegate = () => handler.Handle(args.Message, args.CancellationToken).ContinueWith(_ => Unit.Value); foreach (IAsyncPipelineBehavior behavior in behaviors.Reverse()) { AsyncHandlerDelegate next = handlerDelegate; handlerDelegate = () => behavior.Handle(args.Message, next); } handlerDelegate(); args.Reply(Unit.Value); } }); } } }