private static IServiceCollection AddMediatR( this IServiceCollection services, IReadOnlyCollection <Type> modelTypes, MediatROptions options, Action <MediatRServiceConfiguration> configureService) { foreach (var modelType in modelTypes.Where(x => x.IsClass).Distinct()) { services.SetupQueries(modelType, options).SetupCommands(modelType, options); } services.AddMediatR(new[] { GetExecutingAssembly() }, configureService); var descriptor = services.Single(x => x.ImplementationType == Types.LoggableNotificationHandler); services.Remove(descriptor); foreach (var modelType in modelTypes.Where(x => x.IsClass).Distinct()) { services.SetupNotifications(modelType, options); } return(services); }
private static void SetupMediatRBackupLocalDatabase(ref IServiceCollection services, ref MediatROptions mediatROptions) { Devon4NetLogger.Information("Please setup your database in order to have the RabbitMq messaging backup feature"); if (mediatROptions.Backup == null || !mediatROptions.Backup.UseLocalBackup) { return; } Devon4NetLogger.Information("RabbitMq messaging backup feature is going to be used via LiteDb"); services.AddSingleton <ILiteDbContext, MediatRBackupLiteDbContext>(); services.AddTransient(typeof(IMediatRBackupLiteDbService), typeof(MediatRBackupLiteDbService)); }
/// <summary>Initializes a new instance of the <see cref="LoggingPipelineBehavior{T}"/> class.</summary> /// <param name="mediator">The mediator.</param> /// <param name="options">The options.</param> /// <exception cref="ArgumentNullException"><paramref name="mediator"/> is <see langword="null" /> /// or /// <paramref name="options"/> is <see langword="null" />.</exception> public LoggingPipelineBehavior(IMediator mediator, IOptions <MediatROptions> options) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _options = options?.Value ?? throw new ArgumentNullException(nameof(options)); }
private static IServiceCollection SetupNotifications(this IServiceCollection services, Type modelType, MediatROptions options) { if (!options.UseLoggableNotificationHandler) { return(services); } var notifications = new List <Type>(Types.Notifications); notifications.AddRange(Types.GenericNotifications.Select(type => type.MakeGenericType(modelType))); foreach (var notification in notifications) { var loggableNotificationHandler = Types.LoggableNotificationHandler.MakeGenericType(notification); var notificationHandler = Types.NotificationHandler.MakeGenericType(notification); services.AddScoped(notificationHandler, loggableNotificationHandler); } return(services); }
private static IServiceCollection SetupCommands(this IServiceCollection services, Type modelType, MediatROptions options) { if (!options.UseCommandRequestHandler && !options.UseLoggingPipelineBehavior) { return(services); } foreach (var type in Types.CommandRequests) { AddCommandType(type); } void AddCommandType(Type type) { var request = type.MakeGenericType(modelType); if (options.UseCommandRequestHandler) { var commandRequestHandler = Types.CommandRequestHandler.MakeGenericType(modelType); var requestHandler = Types.RequestHandler.MakeGenericType(request, Types.Unit); services.AddScoped(requestHandler, commandRequestHandler); } if (options.UseLoggingPipelineBehavior) { var loggingBehavior = Types.LoggingPipelineBehavior.MakeGenericType(modelType); var behavior = Types.PipelineBehavior.MakeGenericType(request, Types.Unit); services.AddScoped(behavior, loggingBehavior); } } return(services); }
private static IServiceCollection SetupQueries(this IServiceCollection services, Type modelType, MediatROptions options) { if (!options.UseQueryRequestHandler && !options.UseLoggingPipelineBehavior) { return(services); } var queryRequestHandler = Types.QueryRequestHandler.MakeGenericType(modelType); var loggingBehavior = Types.LoggingPipelineBehavior.MakeGenericType(modelType); if (options.UseQueryRequestHandler) { var queryType = Types.Queryable.MakeGenericType(modelType); var queryRequest = Types.QueryRequest.MakeGenericType(modelType); var requestHandler = Types.RequestHandler.MakeGenericType(queryRequest, queryType); services.AddScoped(requestHandler, queryRequestHandler); } var listType = Types.List.MakeGenericType(modelType); var getRangeRequest = Types.GetRangeRequest.MakeGenericType(modelType); if (options.UseQueryRequestHandler) { var requestHandler = Types.RequestHandler.MakeGenericType(getRangeRequest, listType); services.AddScoped(requestHandler, queryRequestHandler); } if (options.UseLoggingPipelineBehavior) { var behavior = Types.PipelineBehavior.MakeGenericType(getRangeRequest, listType); services.AddScoped(behavior, loggingBehavior); } var getRequest = Types.GetRequest.MakeGenericType(modelType); if (options.UseQueryRequestHandler) { var requestHandler = Types.RequestHandler.MakeGenericType(getRequest, modelType); services.AddScoped(requestHandler, queryRequestHandler); } if (options.UseLoggingPipelineBehavior) { var behavior = Types.PipelineBehavior.MakeGenericType(getRequest, modelType); services.AddScoped(behavior, loggingBehavior); } return(services); }
public static void SetupMediatR(this IServiceCollection services, MediatROptions mediatROptions) { ConfigureMediatRGenericDependencyInjection(ref services); SetupMediatRBackupLocalDatabase(ref services, ref mediatROptions); }