using System.Reflection; using Elsa.Mediator.Implementations; using Elsa.Mediator.Middleware.Command; using Elsa.Mediator.Middleware.Command.Contracts; using Elsa.Mediator.Middleware.Notification; using Elsa.Mediator.Middleware.Notification.Contracts; using Elsa.Mediator.Middleware.Request; using Elsa.Mediator.Middleware.Request.Contracts; using Elsa.Mediator.Models; using Elsa.Mediator.Services; using Elsa.Features.Services; using Elsa.Mediator.Features; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Mediator.Extensions; public static class DependencyInjectionExtensions { public static IModule AddMediator(this IModule module, Action? configure = default) { module.Configure(configure); return module; } public static IServiceCollection AddMediator(this IServiceCollection services) { return services .AddSingleton() .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton() .AddSingleton() .AddSingleton(); } public static IServiceCollection AddCommandHandler(this IServiceCollection services) where THandler : class, ICommandHandler where TCommand : ICommand => services.AddCommandHandler(); public static IServiceCollection AddCommandHandler(this IServiceCollection services) where THandler : class, ICommandHandler where TCommand : ICommand { return services.AddSingleton(); } public static IServiceCollection AddRequestHandler(this IServiceCollection services) where THandler : class, IRequestHandler where TRequest : IRequest? { return services.AddSingleton(); } public static IServiceCollection AddHandlersFrom(this IServiceCollection services) => services.AddHandlersFrom(typeof(TMarker)); public static IServiceCollection AddHandlersFrom(this IServiceCollection services, Type markerType) => services.AddHandlersFrom(markerType.Assembly); public static IServiceCollection AddHandlersFrom(this IServiceCollection services, Assembly assembly) { return services .AddNotificationHandlersFrom(assembly) .AddRequestHandlersFrom(assembly) .AddCommandHandlersFrom(assembly); } public static IServiceCollection AddNotificationHandlersFrom(this IServiceCollection services) => services.AddHandlersFromInternal(typeof(TMarker)); public static IServiceCollection AddNotificationHandlersFrom(this IServiceCollection services, Type markerType) => services.AddHandlersFromInternal(markerType); public static IServiceCollection AddNotificationHandlersFrom(this IServiceCollection services, Assembly assembly) => services.AddHandlersFromInternal(assembly); public static IServiceCollection AddRequestHandlersFrom(this IServiceCollection services) => services.AddHandlersFromInternal(typeof(TMarker)); public static IServiceCollection AddRequestHandlersFrom(this IServiceCollection services, Type markerType) => services.AddHandlersFromInternal(markerType); public static IServiceCollection AddRequestHandlersFrom(this IServiceCollection services, Assembly assembly) => services.AddHandlersFromInternal(assembly); public static IServiceCollection AddCommandHandlersFrom(this IServiceCollection services) => services.AddHandlersFromInternal(typeof(TMarker)); public static IServiceCollection AddCommandHandlersFrom(this IServiceCollection services, Type markerType) => services.AddHandlersFromInternal(markerType); public static IServiceCollection AddCommandHandlersFrom(this IServiceCollection services, Assembly assembly) => services.AddHandlersFromInternal(assembly); private static IServiceCollection AddHandlersFromInternal(this IServiceCollection services) => services.AddHandlersFromInternal(typeof(TMarker)); private static IServiceCollection AddHandlersFromInternal(this IServiceCollection services, Type assemblyMarkerType) => services.AddHandlersFromInternal(assemblyMarkerType.Assembly); private static IServiceCollection AddHandlersFromInternal(this IServiceCollection services, Assembly assembly) { var serviceType = typeof(TService); var types = assembly.ExportedTypes.Where(x => serviceType.IsAssignableFrom(x)); foreach (var type in types) services.AddSingleton(serviceType, type); return services; } }