diff --git a/apiSpec/Microsoft_AspNetCore_Routing_AbpEndpointRouterOptions.md b/apiSpec/Microsoft_AspNetCore_Routing_AbpEndpointRouterOptions.md
index 7747d776e2..f410fd77e3 100644
--- a/apiSpec/Microsoft_AspNetCore_Routing_AbpEndpointRouterOptions.md
+++ b/apiSpec/Microsoft_AspNetCore_Routing_AbpEndpointRouterOptions.md
@@ -1,7 +1,5 @@
----
uid: Microsoft.AspNetCore.Routing.AbpEndpointRouterOptions
summary: '*Summary test'
----
*Information Test*
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml
index a45223e825..d7a2e893d4 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml
@@ -6,7 +6,7 @@
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EfCoreAsyncQueryableProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EfCoreAsyncQueryableProvider.cs
index f9ef8c86e0..68ff261588 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EfCoreAsyncQueryableProvider.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EfCoreAsyncQueryableProvider.cs
@@ -1,5 +1,7 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
+using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
@@ -16,19 +18,332 @@ namespace Volo.Abp.EntityFrameworkCore
return queryable.Provider is EntityQueryProvider;
}
+ public Task ContainsAsync(IQueryable queryable, T item, CancellationToken cancellationToken = default)
+ {
+ return queryable.ContainsAsync(item, cancellationToken);
+ }
+
+ public Task AnyAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.AnyAsync(predicate, cancellationToken);
+ }
+
+ public Task AllAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.AllAsync(predicate, cancellationToken);
+ }
+
public Task CountAsync(IQueryable queryable, CancellationToken cancellationToken = default)
{
return queryable.CountAsync(cancellationToken);
}
- public Task> ToListAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ public Task CountAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
{
- return queryable.ToListAsync(cancellationToken);
+ return queryable.CountAsync(predicate, cancellationToken);
+ }
+
+ public Task LongCountAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.LongCountAsync(cancellationToken);
+ }
+
+ public Task LongCountAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.LongCountAsync(predicate, cancellationToken);
+ }
+
+ public Task FirstAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.FirstAsync(cancellationToken);
+ }
+
+ public Task FirstAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.FirstAsync(predicate, cancellationToken);
}
public Task FirstOrDefaultAsync(IQueryable queryable, CancellationToken cancellationToken = default)
{
return queryable.FirstOrDefaultAsync(cancellationToken);
}
+
+ public Task FirstOrDefaultAsync(IQueryable queryable, Expression> predicate,
+ CancellationToken cancellationToken = default)
+ {
+ return queryable.FirstOrDefaultAsync(predicate, cancellationToken);
+ }
+
+ public Task LastAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.LastAsync(cancellationToken);
+ }
+
+ public Task LastAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.LastAsync(predicate, cancellationToken);
+ }
+
+ public Task LastOrDefaultAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.LastOrDefaultAsync(cancellationToken);
+ }
+
+ public Task LastOrDefaultAsync(IQueryable queryable, Expression> predicate,
+ CancellationToken cancellationToken = default)
+ {
+ return queryable.LastOrDefaultAsync(predicate, cancellationToken);
+ }
+
+ public Task SingleAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SingleAsync(cancellationToken);
+ }
+
+ public Task SingleAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return queryable.SingleAsync(predicate, cancellationToken);
+ }
+
+ public Task SingleOrDefaultAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SingleOrDefaultAsync(cancellationToken);
+ }
+
+ public Task SingleOrDefaultAsync(IQueryable queryable, Expression> predicate,
+ CancellationToken cancellationToken = default)
+ {
+ return queryable.SingleOrDefaultAsync(predicate, cancellationToken);
+ }
+
+ public Task MinAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.MinAsync(cancellationToken);
+ }
+
+ public Task MinAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.MinAsync(selector, cancellationToken);
+ }
+
+ public Task MaxAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.MaxAsync(cancellationToken);
+ }
+
+ public Task MaxAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.MaxAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task SumAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.SumAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task AverageAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default)
+ {
+ return queryable.AverageAsync(selector, cancellationToken);
+ }
+
+ public Task> ToListAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.ToListAsync(cancellationToken);
+ }
+
+ public Task ToArrayAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return queryable.ToArrayAsync(cancellationToken);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs
index 767bdf6e27..cffda462b0 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs
@@ -18,10 +18,5 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
{
return DbContext.SaveChangesAsync(cancellationToken);
}
-
- public void SaveChanges()
- {
- DbContext.SaveChanges();
- }
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
index 33f9aca1a7..99622dda96 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
@@ -21,7 +21,13 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
AttendedDbContexts = new List();
}
- public void Commit()
+ public Task CommitAsync()
+ {
+ Commit();
+ return Task.CompletedTask;
+ }
+
+ protected void Commit()
{
DbContextTransaction.Commit();
@@ -36,12 +42,6 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
}
- public Task CommitAsync()
- {
- Commit();
- return Task.CompletedTask;
- }
-
public void Dispose()
{
DbContextTransaction.Dispose();
diff --git a/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs b/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs
index e3fd273026..e20b60bf54 100644
--- a/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs
+++ b/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicHttpClientProxyExtensions.cs
@@ -45,11 +45,8 @@ namespace Microsoft.Extensions.DependencyInjection
AddHttpClientFactoryAndPolicy(services, remoteServiceConfigurationName, configureHttpClientBuilder);
//TODO: Make a configuration option and add remoteServiceName inside it!
- //TODO: Add option to change type filter
- var serviceTypes = assembly.GetTypes().Where(t =>
- t.IsInterface && t.IsPublic && typeof(IRemoteService).IsAssignableFrom(t)
- );
+ var serviceTypes = assembly.GetTypes().Where(IsSuitableForDynamicClientProxying);
foreach (var serviceType in serviceTypes)
{
@@ -155,7 +152,7 @@ namespace Microsoft.Extensions.DependencyInjection
services.AddTransient(interceptorType);
var interceptorAdapterType = typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(interceptorType);
-
+
var validationInterceptorAdapterType =
typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(typeof(ValidationInterceptor));
@@ -191,5 +188,21 @@ namespace Microsoft.Extensions.DependencyInjection
return services;
}
+
+ ///
+ /// Checks wether the type is suitable to use with the dynamic proxying.
+ /// Currently the type is checked statically against some fixed conditions.
+ ///
+ /// Type to check
+ /// True, if the type is suitable for dynamic proxying. Otherwise false.
+ static bool IsSuitableForDynamicClientProxying(Type type)
+ {
+ //TODO: Add option to change type filter
+
+ return type.IsInterface
+ && type.IsPublic
+ && !type.IsGenericType
+ && typeof(IRemoteService).IsAssignableFrom(type);
+ }
}
}
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
index e98c0738fd..e2e5b7b9fe 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
@@ -1,4 +1,6 @@
-using Microsoft.Extensions.DependencyInjection;
+using System.Linq;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Http;
using Volo.Abp.Castle;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
@@ -21,5 +23,24 @@ namespace Volo.Abp.Http.Client
var configuration = context.Services.GetConfiguration();
Configure(configuration);
}
+
+ public override void PostConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ if (options.HttpClientActions.Any())
+ {
+ var httpClientNames = options.HttpClientProxies.Select(x => x.Value.RemoteServiceName);
+ foreach (var httpClientName in httpClientNames)
+ {
+ foreach (var httpClientAction in options.HttpClientActions)
+ {
+ context.Services.Configure(httpClientName,
+ x => x.HttpClientActions.Add(httpClientAction.Invoke(httpClientName)));
+ }
+ }
+ }
+ });
+ }
}
}
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
index 5adcd7525f..54cc4eb624 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Net.Http;
using Volo.Abp.Http.Client.DynamicProxying;
namespace Volo.Abp.Http.Client
@@ -8,9 +9,12 @@ namespace Volo.Abp.Http.Client
{
public Dictionary HttpClientProxies { get; set; }
+ public List>> HttpClientActions { get; }
+
public AbpHttpClientOptions()
{
HttpClientProxies = new Dictionary();
+ HttpClientActions = new List>>();
}
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
index c192fc8feb..b338385861 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
@@ -25,17 +25,20 @@ namespace Volo.Abp.IdentityModel
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IHttpClientFactory HttpClientFactory { get; }
protected ICurrentTenant CurrentTenant { get; }
+ protected IdentityModelHttpRequestMessageOptions IdentityModelHttpRequestMessageOptions { get; }
public IdentityModelAuthenticationService(
IOptions options,
ICancellationTokenProvider cancellationTokenProvider,
IHttpClientFactory httpClientFactory,
- ICurrentTenant currentTenant)
+ ICurrentTenant currentTenant,
+ IOptions identityModelHttpRequestMessageOptions)
{
ClientOptions = options.Value;
CancellationTokenProvider = cancellationTokenProvider;
HttpClientFactory = httpClientFactory;
CurrentTenant = currentTenant;
+ IdentityModelHttpRequestMessageOptions = identityModelHttpRequestMessageOptions.Value;
Logger = NullLogger.Instance;
}
@@ -74,7 +77,7 @@ namespace Volo.Abp.IdentityModel
}
var tokenResponse = await GetTokenResponse(discoveryResponse, configuration);
-
+
if (tokenResponse.IsError)
{
if (tokenResponse.ErrorDescription != null)
@@ -112,14 +115,16 @@ namespace Volo.Abp.IdentityModel
{
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
- return await httpClient.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest
+ var request = new DiscoveryDocumentRequest
{
Address = configuration.Authority,
Policy =
{
RequireHttps = configuration.RequireHttps
}
- });
+ };
+ IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage(request);
+ return await httpClient.GetDiscoveryDocumentAsync(request);
}
}
@@ -160,6 +165,7 @@ namespace Volo.Abp.IdentityModel
UserName = configuration.UserName,
Password = configuration.UserPassword
};
+ IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage(request);
AddParametersToRequestAsync(configuration, request);
@@ -177,6 +183,7 @@ namespace Volo.Abp.IdentityModel
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret
};
+ IdentityModelHttpRequestMessageOptions.ConfigureHttpRequestMessage(request);
AddParametersToRequestAsync(configuration, request);
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelHttpRequestMessageOptions.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelHttpRequestMessageOptions.cs
new file mode 100644
index 0000000000..23b26faaf6
--- /dev/null
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelHttpRequestMessageOptions.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Net.Http;
+
+namespace Volo.Abp.IdentityModel
+{
+ public class IdentityModelHttpRequestMessageOptions
+ {
+ public Action ConfigureHttpRequestMessage { get; set; }
+ }
+}
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoDbAsyncQueryableProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoDbAsyncQueryableProvider.cs
index 8b0c56c812..206c4add39 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoDbAsyncQueryableProvider.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoDbAsyncQueryableProvider.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
@@ -17,19 +18,337 @@ namespace Volo.Abp.MongoDB
return queryable.Provider.GetType().Namespace?.StartsWith("MongoDB") ?? false;
}
+ protected IMongoQueryable GetMongoQueryable(IQueryable queryable)
+ {
+ return (IMongoQueryable) queryable;
+ }
+
+ public Task ContainsAsync(IQueryable queryable, T item, CancellationToken cancellationToken = default)
+ {
+ return Task.FromResult(GetMongoQueryable(queryable).Contains(item));
+ }
+
+ public Task AnyAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return GetMongoQueryable(queryable).AnyAsync(predicate, cancellationToken);
+ }
+
+ public Task AllAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return Task.FromResult(GetMongoQueryable(queryable).All(predicate));
+ }
+
public Task CountAsync(IQueryable queryable, CancellationToken cancellationToken = default)
{
- return ((IMongoQueryable) queryable).CountAsync(cancellationToken);
+ return GetMongoQueryable(queryable).CountAsync(cancellationToken);
}
- public Task> ToListAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ public Task CountAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default)
+ {
+ return GetMongoQueryable(queryable).CountAsync(predicate, cancellationToken);
+ }
+
+ public Task LongCountAsync(IQueryable queryable, CancellationToken cancellationToken = default)
+ {
+ return GetMongoQueryable(queryable).LongCountAsync(cancellationToken);
+ }
+
+ public Task LongCountAsync(IQueryable