diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
index 0d5c7612b2..96caf956b1 100644
--- a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
+++ b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
@@ -89,7 +89,7 @@ namespace Autofac.Builder
foreach (var interceptor in interceptors)
{
registrationBuilder.InterceptedBy(
- typeof(CastleAbpInterceptorAdapter<>).MakeGenericType(interceptor)
+ typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(interceptor)
);
}
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj
index adcf4f8c2f..3d01363064 100644
--- a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj
+++ b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj
@@ -15,6 +15,7 @@
+
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/AbpCastleCoreModule.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/AbpCastleCoreModule.cs
index 0f9a10bda1..0cb59767a4 100644
--- a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/AbpCastleCoreModule.cs
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/AbpCastleCoreModule.cs
@@ -8,7 +8,7 @@ namespace Volo.Abp.Castle
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
- context.Services.AddTransient(typeof(CastleAbpInterceptorAdapter<>));
+ context.Services.AddTransient(typeof(AbpAsyncDeterminationInterceptor<>));
}
}
}
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/AbpAsyncDeterminationInterceptor.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/AbpAsyncDeterminationInterceptor.cs
new file mode 100644
index 0000000000..4f852ce475
--- /dev/null
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/AbpAsyncDeterminationInterceptor.cs
@@ -0,0 +1,15 @@
+using Castle.DynamicProxy;
+using Volo.Abp.DynamicProxy;
+
+namespace Volo.Abp.Castle.DynamicProxy
+{
+ public class AbpAsyncDeterminationInterceptor : AsyncDeterminationInterceptor
+ where TInterceptor : IAbpInterceptor
+ {
+ public AbpAsyncDeterminationInterceptor(TInterceptor abpInterceptor)
+ : base(new CastleAsyncAbpInterceptorAdapter(abpInterceptor))
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpInterceptorAdapter.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpInterceptorAdapter.cs
deleted file mode 100644
index 00dc33a59a..0000000000
--- a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpInterceptorAdapter.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System.Reflection;
-using System.Threading.Tasks;
-using Castle.DynamicProxy;
-using Volo.Abp.DynamicProxy;
-using Volo.Abp.Threading;
-
-namespace Volo.Abp.Castle.DynamicProxy
-{
- public class CastleAbpInterceptorAdapter : IInterceptor
- where TInterceptor : IAbpInterceptor
- {
- private static readonly MethodInfo MethodExecuteWithReturnValueAsync =
- typeof(CastleAbpInterceptorAdapter)
- .GetMethod(
- nameof(ExecuteWithReturnValueAsync),
- BindingFlags.NonPublic | BindingFlags.Instance
- );
-
- private readonly TInterceptor _abpInterceptor;
-
- public CastleAbpInterceptorAdapter(TInterceptor abpInterceptor)
- {
- _abpInterceptor = abpInterceptor;
- }
-
- public void Intercept(IInvocation invocation)
- {
- var proceedInfo = invocation.CaptureProceedInfo();
-
- var method = invocation.MethodInvocationTarget ?? invocation.Method;
-
- if (!method.IsAsync())
- {
- proceedInfo.Invoke();
- return;
- }
-
- InterceptAsyncMethod(invocation, proceedInfo);
- }
-
- private void InterceptAsyncMethod(IInvocation invocation, IInvocationProceedInfo proceedInfo)
- {
- if (invocation.Method.ReturnType == typeof(Task))
- {
- invocation.ReturnValue = ExecuteWithoutReturnValueAsync(invocation, proceedInfo);
- }
- else
- {
- invocation.ReturnValue = MethodExecuteWithReturnValueAsync
- .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
- .Invoke(this, new object[] {invocation, proceedInfo});
- }
- }
-
- private async Task ExecuteWithoutReturnValueAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo)
- {
- await _abpInterceptor.InterceptAsync(
- new CastleAbpMethodInvocationAdapter(invocation, proceedInfo)
- );
- }
-
- private async Task ExecuteWithReturnValueAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo)
- {
- await Task.Yield();
-
- await _abpInterceptor.InterceptAsync(
- new CastleAbpMethodInvocationAdapter(invocation, proceedInfo)
- );
-
- return await (Task)invocation.ReturnValue;
- }
- }
-}
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapter.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapter.cs
index 13f59cb0c1..89f3713521 100644
--- a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapter.cs
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapter.cs
@@ -1,65 +1,26 @@
using System;
-using System.Collections.Generic;
-using System.Reflection;
using System.Threading.Tasks;
using Castle.DynamicProxy;
using Volo.Abp.DynamicProxy;
-using Volo.Abp.Threading;
namespace Volo.Abp.Castle.DynamicProxy
{
- public class CastleAbpMethodInvocationAdapter : IAbpMethodInvocation
+ public class CastleAbpMethodInvocationAdapter : CastleAbpMethodInvocationAdapterBase, IAbpMethodInvocation
{
- public object[] Arguments => Invocation.Arguments;
-
- public IReadOnlyDictionary ArgumentsDictionary => _lazyArgumentsDictionary.Value;
- private readonly Lazy> _lazyArgumentsDictionary;
-
- public Type[] GenericArguments => Invocation.GenericArguments;
-
- public object TargetObject => Invocation.InvocationTarget ?? Invocation.MethodInvocationTarget;
-
- public MethodInfo Method => Invocation.MethodInvocationTarget ?? Invocation.Method;
-
- public object ReturnValue
- {
- get => _actualReturnValue ?? Invocation.ReturnValue;
- set => Invocation.ReturnValue = value;
- }
-
- private object _actualReturnValue;
-
- protected IInvocation Invocation { get; }
protected IInvocationProceedInfo ProceedInfo { get; }
+ protected Func Proceed { get; }
- public CastleAbpMethodInvocationAdapter(IInvocation invocation, IInvocationProceedInfo proceedInfo)
+ public CastleAbpMethodInvocationAdapter(IInvocation invocation, IInvocationProceedInfo proceedInfo,
+ Func proceed)
+ : base(invocation)
{
- Invocation = invocation;
ProceedInfo = proceedInfo;
-
- _lazyArgumentsDictionary = new Lazy>(GetArgumentsDictionary);
- }
-
- public Task ProceedAsync()
- {
- ProceedInfo.Invoke();
-
- _actualReturnValue = Invocation.ReturnValue;
-
- return (Task) _actualReturnValue;
+ Proceed = proceed;
}
- private IReadOnlyDictionary GetArgumentsDictionary()
+ public override async Task ProceedAsync()
{
- var dict = new Dictionary();
-
- var methodParameters = Method.GetParameters();
- for (int i = 0; i < methodParameters.Length; i++)
- {
- dict[methodParameters[i].Name] = Invocation.Arguments[i];
- }
-
- return dict;
+ await Proceed(Invocation, ProceedInfo);
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterBase.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterBase.cs
new file mode 100644
index 0000000000..09609699a8
--- /dev/null
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterBase.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading.Tasks;
+using Castle.DynamicProxy;
+using Volo.Abp.DynamicProxy;
+
+namespace Volo.Abp.Castle.DynamicProxy
+{
+ public abstract class CastleAbpMethodInvocationAdapterBase : IAbpMethodInvocation
+ {
+ public object[] Arguments => Invocation.Arguments;
+
+ public IReadOnlyDictionary ArgumentsDictionary => _lazyArgumentsDictionary.Value;
+ private readonly Lazy> _lazyArgumentsDictionary;
+
+ public Type[] GenericArguments => Invocation.GenericArguments;
+
+ public object TargetObject => Invocation.InvocationTarget ?? Invocation.MethodInvocationTarget;
+
+ public MethodInfo Method => Invocation.MethodInvocationTarget ?? Invocation.Method;
+
+ public object ReturnValue { get; set; }
+
+ protected IInvocation Invocation { get; }
+
+ protected CastleAbpMethodInvocationAdapterBase(IInvocation invocation)
+ {
+ Invocation = invocation;
+ _lazyArgumentsDictionary = new Lazy>(GetArgumentsDictionary);
+ }
+
+ public abstract Task ProceedAsync();
+
+ private IReadOnlyDictionary GetArgumentsDictionary()
+ {
+ var dict = new Dictionary();
+
+ var methodParameters = Method.GetParameters();
+ for (int i = 0; i < methodParameters.Length; i++)
+ {
+ dict[methodParameters[i].Name] = Invocation.Arguments[i];
+ }
+
+ return dict;
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterWithReturnValue.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterWithReturnValue.cs
new file mode 100644
index 0000000000..bf91102337
--- /dev/null
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAbpMethodInvocationAdapterWithReturnValue.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Threading.Tasks;
+using Castle.DynamicProxy;
+using Volo.Abp.DynamicProxy;
+
+namespace Volo.Abp.Castle.DynamicProxy
+{
+ public class CastleAbpMethodInvocationAdapterWithReturnValue : CastleAbpMethodInvocationAdapterBase, IAbpMethodInvocation
+ {
+ protected IInvocationProceedInfo ProceedInfo { get; }
+ protected Func> Proceed { get; }
+
+ public CastleAbpMethodInvocationAdapterWithReturnValue(IInvocation invocation,
+ IInvocationProceedInfo proceedInfo,
+ Func> proceed)
+ : base(invocation)
+ {
+ ProceedInfo = proceedInfo;
+ Proceed = proceed;
+ }
+
+ public override async Task ProceedAsync()
+ {
+ ReturnValue = await Proceed(Invocation, ProceedInfo);
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAsyncAbpInterceptorAdapter.cs b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAsyncAbpInterceptorAdapter.cs
new file mode 100644
index 0000000000..8a0c4fdd45
--- /dev/null
+++ b/framework/src/Volo.Abp.Castle.Core/Volo/Abp/Castle/DynamicProxy/CastleAsyncAbpInterceptorAdapter.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Threading.Tasks;
+using Castle.DynamicProxy;
+using Volo.Abp.DynamicProxy;
+
+namespace Volo.Abp.Castle.DynamicProxy
+{
+ public class CastleAsyncAbpInterceptorAdapter : AsyncInterceptorBase
+ where TInterceptor : IAbpInterceptor
+ {
+ private readonly TInterceptor _abpInterceptor;
+
+ public CastleAsyncAbpInterceptorAdapter(TInterceptor abpInterceptor)
+ {
+ _abpInterceptor = abpInterceptor;
+ }
+
+ protected override async Task InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func proceed)
+ {
+ await _abpInterceptor.InterceptAsync(
+ new CastleAbpMethodInvocationAdapter(invocation, proceedInfo, proceed)
+ );
+ }
+
+ protected override async Task InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func> proceed)
+ {
+ var adapter = new CastleAbpMethodInvocationAdapterWithReturnValue(invocation, proceedInfo, proceed);
+
+ await _abpInterceptor.InterceptAsync(
+ adapter
+ );
+
+ return (TResult)adapter.ReturnValue;
+ }
+ }
+}
\ No newline at end of file
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 54387d2871..f34a732cb0 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
@@ -53,7 +53,7 @@ namespace Microsoft.Extensions.DependencyInjection
foreach (var serviceType in serviceTypes)
{
services.AddHttpClientProxy(
- serviceType,
+ serviceType,
remoteServiceConfigurationName,
asDefaultServices
);
@@ -153,7 +153,7 @@ namespace Microsoft.Extensions.DependencyInjection
var interceptorType = typeof(DynamicHttpProxyInterceptor<>).MakeGenericType(type);
services.AddTransient(interceptorType);
- var interceptorAdapterType = typeof(CastleAbpInterceptorAdapter<>).MakeGenericType(interceptorType);
+ var interceptorAdapterType = typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(interceptorType);
if (asDefaultService)
{
@@ -174,7 +174,7 @@ namespace Microsoft.Extensions.DependencyInjection
var service = ProxyGeneratorInstance
.CreateInterfaceProxyWithoutTarget(
type,
- (IInterceptor) serviceProvider.GetRequiredService(interceptorAdapterType)
+ (IInterceptor)serviceProvider.GetRequiredService(interceptorAdapterType)
);
return Activator.CreateInstance(
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
index 42fdb0afc3..3e0124237f 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
@@ -74,18 +74,33 @@ namespace Volo.Abp.Http.Client.DynamicProxying
Logger = NullLogger>.Instance;
}
- public override Task InterceptAsync(IAbpMethodInvocation invocation)
+ public override async Task InterceptAsync(IAbpMethodInvocation invocation)
{
if (invocation.Method.ReturnType.GenericTypeArguments.IsNullOrEmpty())
{
- return MakeRequestAsync(invocation);
+ await MakeRequestAsync(invocation);
}
+ else
+ {
+ var result = (Task)GenericInterceptAsyncMethod
+ .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
+ .Invoke(this, new object[] { invocation });
- invocation.ReturnValue = GenericInterceptAsyncMethod
- .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
- .Invoke(this, new object[] { invocation });
+ invocation.ReturnValue = await GetResultAsync(
+ result,
+ invocation.Method.ReturnType.GetGenericArguments()[0]
+ );
+ }
- return Task.CompletedTask;
+ }
+
+ private async Task