using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OpenHarbor.CQRS.Abstractions; using OpenHarbor.CQRS.Abstractions.Discovery; using OpenHarbor.CQRS.DynamicQuery.Abstractions; using OpenHarbor.CQRS.DynamicQuery.Discover; using PoweredSoft.DynamicQuery.Core; namespace OpenHarbor.CQRS.DynamicQuery; public static class ServiceCollectionExtensions { public static IServiceCollection AddDynamicQuery(this IServiceCollection services, string name = null) where TSourceAndDestination : class => AddDynamicQuery(services, name: name); public static IServiceCollection AddDynamicQuery(this IServiceCollection services, string name = null) where TSource : class where TDestination : class { // add query handler. services.AddTransient, IQueryExecutionResult>, DynamicQueryHandler>(); // add for discovery purposes. var queryType = typeof(IDynamicQuery); var resultType = typeof(IQueryExecutionResult); var serviceType = typeof(DynamicQueryHandler); var queryMeta = new DynamicQueryMeta(queryType, serviceType, resultType) { OverridableName = name }; services.AddSingleton(queryMeta); return services; } public static IServiceCollection AddDynamicQueryWithProvider(this IServiceCollection services, string name = null) where TQueryableProvider : class, IQueryableProvider where TSource : class { services.AddTransient, TQueryableProvider>() .AddDynamicQuery(name: name); return services; } public static IServiceCollection AddDynamicQueryWithParamsAndProvider(this IServiceCollection services, string name = null) where TQueryableProvider : class, IQueryableProvider where TParams : class where TSource : class { services.AddTransient, TQueryableProvider>() .AddDynamicQueryWithParams(name: name); return services; } public static IServiceCollection AddDynamicQueryWithParams(this IServiceCollection services, string name = null) where TSourceAndDestination : class where TParams : class => AddDynamicQueryWithParams(services, name: name); public static IServiceCollection AddDynamicQueryWithParams(this IServiceCollection services, string name = null) where TSource : class where TDestination : class where TParams : class { // add query handler. services.AddTransient, IQueryExecutionResult>, DynamicQueryHandler>(); // add for discovery purposes. var queryType = typeof(IDynamicQuery); var resultType = typeof(IQueryExecutionResult); var serviceType = typeof(DynamicQueryHandler); var queryMeta = new DynamicQueryMeta(queryType, serviceType, resultType) { // params type. ParamsType = typeof(TParams), OverridableName = name }; services.AddSingleton(queryMeta); return services; } public static IServiceCollection AddAlterQueryable(this IServiceCollection services) where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } public static IServiceCollection AddAlterQueryable(this IServiceCollection services) where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } public static IServiceCollection AddAlterQueryableWithParams (this IServiceCollection services) where TParams : class where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } public static IServiceCollection AddAlterQueryableWithParams (this IServiceCollection services) where TParams : class where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } public static IServiceCollection AddDynamicQueryInterceptor(this IServiceCollection services) where TInterceptor : class, IQueryInterceptor { services.TryAddTransient(); return services.AddSingleton>( new DynamicQueryInterceptorProvider(typeof(TInterceptor))); } public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor { services.TryAddTransient(); services.TryAddTransient(); return services.AddSingleton>( new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2))); } public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor { services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); return services.AddSingleton>( new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2), typeof(T3))); } public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor where T4 : class, IQueryInterceptor { services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); return services.AddSingleton>( new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2), typeof(T3), typeof(T4))); } public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor where T4 : class, IQueryInterceptor where T5 : class, IQueryInterceptor { services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); services.TryAddTransient(); return services.AddSingleton>( new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5))); } }