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);
        }
Esempio n. 2
0
        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);
 }