From d01ac1601c31579092f1bd9d6f6a20de8fcf3130 Mon Sep 17 00:00:00 2001 From: David Lebee Date: Tue, 2 Feb 2021 20:39:59 -0500 Subject: [PATCH] now supports interceptors for dynamic query. --- .../DynamicQueryHandler.cs | 5 +++-- .../DynamicQueryHandlerBase.cs | 22 ++++++++++++++++++- .../ServiceCollectionExtensions.cs | 18 +++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandler.cs b/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandler.cs index f74fff1..09c1dde 100644 --- a/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandler.cs +++ b/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandler.cs @@ -1,5 +1,6 @@ using PoweredSoft.CQRS.DynamicQuery.Abstractions; using PoweredSoft.DynamicQuery.Core; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -15,7 +16,7 @@ namespace PoweredSoft.CQRS.DynamicQuery { public DynamicQueryHandler(IQueryHandlerAsync queryHandlerAsync, IEnumerable> queryableProviders, - IEnumerable> alterQueryableServices) : base(queryHandlerAsync, queryableProviders, alterQueryableServices) + IEnumerable> alterQueryableServices, IServiceProvider serviceProvider) : base(queryHandlerAsync, queryableProviders, alterQueryableServices, serviceProvider) { } @@ -37,7 +38,7 @@ namespace PoweredSoft.CQRS.DynamicQuery public DynamicQueryHandler(IQueryHandlerAsync queryHandlerAsync, IEnumerable> queryableProviders, IEnumerable> alterQueryableServices, - IEnumerable> alterQueryableServicesWithParams) : base(queryHandlerAsync, queryableProviders, alterQueryableServices) + IEnumerable> alterQueryableServicesWithParams, IServiceProvider serviceProvider) : base(queryHandlerAsync, queryableProviders, alterQueryableServices, serviceProvider) { this.alterQueryableServicesWithParams = alterQueryableServicesWithParams; } diff --git a/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandlerBase.cs b/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandlerBase.cs index 0f5170e..4184ed3 100644 --- a/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandlerBase.cs +++ b/PoweredSoft.CQRS.DynamicQuery/DynamicQueryHandlerBase.cs @@ -16,14 +16,17 @@ namespace PoweredSoft.CQRS.DynamicQuery private readonly IQueryHandlerAsync queryHandlerAsync; private readonly IEnumerable> queryableProviders; private readonly IEnumerable> alterQueryableServices; + private readonly IServiceProvider serviceProvider; public DynamicQueryHandlerBase(IQueryHandlerAsync queryHandlerAsync, IEnumerable> queryableProviders, - IEnumerable> alterQueryableServices) + IEnumerable> alterQueryableServices, + IServiceProvider serviceProvider) { this.queryHandlerAsync = queryHandlerAsync; this.queryableProviders = queryableProviders; this.alterQueryableServices = alterQueryableServices; + this.serviceProvider = serviceProvider; } protected virtual Task> GetQueryableAsync(IDynamicQuery query, CancellationToken cancellationToken = default) @@ -51,6 +54,23 @@ namespace PoweredSoft.CQRS.DynamicQuery var options = GetQueryExecutionOptions(source, query); var interceptors = this.GetInterceptors(); + // basic after read service. + var afterReadService1 = this.serviceProvider.GetService(typeof(IAfterReadInterceptorAsync)); + if (afterReadService1 is IQueryInterceptor ars1) + queryHandlerAsync.AddInterceptor(ars1); + + // support of injecting a query convert interceptor. + if (typeof(TSource) != typeof(TDestination)) + { + var convertService = this.serviceProvider.GetService(typeof(IQueryConvertInterceptor)); + if (convertService is IQueryInterceptor cs) + queryHandlerAsync.AddInterceptor(cs); + + var afterReadService2 = this.serviceProvider.GetService(typeof(IAfterReadInterceptorAsync)); + if (afterReadService2 is IQueryInterceptor ars2) + queryHandlerAsync.AddInterceptor(ars2); + } + foreach (var interceptor in interceptors) queryHandlerAsync.AddInterceptor(interceptor); diff --git a/PoweredSoft.CQRS.DynamicQuery/ServiceCollectionExtensions.cs b/PoweredSoft.CQRS.DynamicQuery/ServiceCollectionExtensions.cs index 0b977a0..988f0a3 100644 --- a/PoweredSoft.CQRS.DynamicQuery/ServiceCollectionExtensions.cs +++ b/PoweredSoft.CQRS.DynamicQuery/ServiceCollectionExtensions.cs @@ -94,5 +94,23 @@ namespace PoweredSoft.CQRS.DynamicQuery { return services.AddTransient, TService>(); } + + public static IServiceCollection AddQueryConvertInterceptor(this IServiceCollection services) + where TService : class, IQueryConvertInterceptor + { + return services.AddTransient, TService>(); + } + + public static IServiceCollection AddAfterReadInterceptorAsync(this IServiceCollection services) + where TService : class, IAfterReadInterceptorAsync + { + return services.AddTransient, TService>(); + } + + public static IServiceCollection AddAfterReadInterceptorAsync(this IServiceCollection services) + where TService : class, IAfterReadInterceptorAsync + { + return services.AddTransient, TService>(); + } } }