/// <summary> /// Registers mediatr to net core DI without relying on reflection. /// </summary> /// <param name="services">.Net Core services collection to register mediatr to.</param> /// <param name="logger">Instance of logging framework.</param> /// <param name="serviceConfiguration">The mediatr service configuration.</param> /// <param name="mediatrRegistration"> /// The mediatr explicit registration details. /// This is the part specific to this functionality to avoid reflection. /// The object contains all the relevant details compiled up front. /// </param> public static void RegisterMediatrWithExplicitTypes( IServiceCollection services, ILogger?logger, MediatRServiceConfiguration serviceConfiguration, IMediatrRegistration mediatrRegistration) { if (mediatrRegistration == null) { throw new ArgumentNullException(nameof(mediatrRegistration)); } Register( services, logger, mediatrRegistration.RequestHandlers); Register( services, logger, mediatrRegistration.NotificationHandlers); Register( services, logger, mediatrRegistration.RequestPreProcessors); Register( services, logger, mediatrRegistration.RequestPostProcessors); MediatR.Registration.ServiceRegistrar.AddRequiredServices(services, serviceConfiguration); }
public static void AddRequiredServices(IServiceCollection services, MediatRServiceConfiguration serviceConfiguration) { services.AddTransient <ServiceFactory>(p => p.GetService); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(RequestPreProcessorBehavior <,>)); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(RequestPostProcessorBehavior <,>)); services.Add(new ServiceDescriptor(typeof(IMediator), serviceConfiguration.MediatorImplementationType, serviceConfiguration.Lifetime)); }
/// <summary> /// Uses MediatR. /// </summary> /// <param name="builder">The builder.</param> /// <param name="serviceConfig">The MediatR service configuration.</param> /// <returns>IServiceConventionContext.</returns> public static IServiceConventionContext UseMediatR( this IServiceConventionContext builder, MediatRServiceConfiguration serviceConfig ) { if (builder is null) { throw new ArgumentNullException(nameof(builder)); } if (serviceConfig is null) { throw new ArgumentNullException(nameof(serviceConfig)); } if (builder.Services.Any(z => z.ServiceType == typeof(IMediator))) { return(builder); } builder.Set(serviceConfig); var assemblies = builder.AssemblyCandidateFinder .GetCandidateAssemblies(nameof(MediatR)).ToArray(); ServiceRegistrar.AddRequiredServices(builder.Services, serviceConfig); ServiceRegistrar.AddMediatRClasses(builder.Services, assemblies); return(builder); }
public static void AddLeeliteCore(this IServiceCollection services) { services.AddMapper(); var serviceConfig = new MediatRServiceConfiguration(); serviceConfig.AsScoped(); ServiceRegistrar.AddRequiredServices(services, serviceConfig); }
public static void AddRequiredServices(IServiceCollection services, MediatRServiceConfiguration serviceConfiguration) { // Use TryAdd, so any existing ServiceFactory/IMediator registration doesn't get overriden services.TryAddTransient <ServiceFactory>(p => p.GetService); services.TryAdd(new ServiceDescriptor(typeof(IMediator), serviceConfiguration.MediatorImplementationType, serviceConfiguration.Lifetime)); // Use TryAddTransientExact (see below), we dó want to register our Pre/Post processor behavior, even if (a more concrete) // registration for IPipelineBehavior<,> already exists. But only once. services.TryAddTransientExact(typeof(IPipelineBehavior <,>), typeof(RequestPreProcessorBehavior <,>)); services.TryAddTransientExact(typeof(IPipelineBehavior <,>), typeof(RequestPostProcessorBehavior <,>)); services.TryAddTransientExact(typeof(IPipelineBehavior <,>), typeof(RequestExceptionActionProcessorBehavior <,>)); services.TryAddTransientExact(typeof(IPipelineBehavior <,>), typeof(RequestExceptionProcessorBehavior <,>)); }
/// <summary> /// Adds MediatR. /// </summary> /// <param name="builder">The builder.</param> /// <param name="serviceConfig">The MediatR service configuration.</param> /// <returns>IConventionHostBuilder.</returns> public static IConventionHostBuilder UseMediatR( this IConventionHostBuilder builder, MediatRServiceConfiguration serviceConfig ) { if (builder is null) { throw new ArgumentNullException(nameof(builder)); } if (serviceConfig is null) { throw new ArgumentNullException(nameof(serviceConfig)); } builder.Set(serviceConfig); builder.Scanner.PrependConvention <MediatRConvention>(); return(builder); }