using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; namespace Toolkit.Foundation; public class HandlerInitialization(IServiceProvider provider) : IInitialization where THandler : class, IHandler 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>(); HandlerDelegate handlerDelegate = () => { TResponse response = default!; foreach (IHandler handler in handlers) { response = handler.Handle(args.Message); } return response; }; foreach (IPipelineBehavior behavior in behaviors.Reverse()) { HandlerDelegate next = handlerDelegate; handlerDelegate = () => behavior.Handle(args.Message, next); } handlerDelegate(); }); } } } public class HandlerInitialization(IServiceProvider provider) : IInitialization where THandler : class, IHandler 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>(); HandlerDelegate handlerDelegate = () => { foreach (IHandler handler in handlers) { handler.Handle(args); } return Unit.Value; }; foreach (IPipelineBehavior behavior in behaviors.Reverse()) { HandlerDelegate next = handlerDelegate; handlerDelegate = () => behavior.Handle(args, next); } handlerDelegate(); }); } } }