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