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