Skip to content

Commit 922b350

Browse files
committed
ApiInterceptor增加CreateApiActionContext方法,提供扩展的能力
1 parent 8a7a86b commit 922b350

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

WebApiClient/Defaults/ApiInterceptor.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,11 @@ public ApiInterceptor(HttpApiConfig httpApiConfig)
4747
/// <returns></returns>
4848
public virtual object Intercept(object target, MethodInfo method, object[] parameters)
4949
{
50+
var httpApi = target as IHttpApi;
5051
var descriptor = this.GetApiActionDescriptor(method, parameters);
51-
var apiTask = descriptor.Return.DataType.ITaskFactory.Invoke() as ApiTask;
5252

53-
apiTask.HttpApi = target as IHttpApi;
54-
apiTask.HttpApiConfig = this.HttpApiConfig;
55-
apiTask.ApiActionDescriptor = descriptor;
53+
var apiTask = descriptor.Return.DataType.ITaskFactory.Invoke() as ApiTask;
54+
apiTask.ContextFactory = () => this.CreateApiActionContext(httpApi, descriptor);
5655

5756
if (descriptor.Return.IsITaskDefinition == false)
5857
{
@@ -66,6 +65,7 @@ public virtual object Intercept(object target, MethodInfo method, object[] param
6665

6766
/// <summary>
6867
/// 获取api的描述
68+
/// 默认实现使用了缓存
6969
/// </summary>
7070
/// <param name="method">接口的方法</param>
7171
/// <param name="parameters">参数值集合</param>
@@ -75,6 +75,17 @@ protected virtual ApiActionDescriptor GetApiActionDescriptor(MethodInfo method,
7575
return descriptorCache.GetOrAdd(method, m => new ApiActionDescriptor(m)).Clone(parameters);
7676
}
7777

78+
/// <summary>
79+
/// 返回创建ApiActionContext新实例
80+
/// </summary>
81+
/// <param name="httpApi">httpApi代理类实例</param>
82+
/// <param name="apiActionDescriptor">api的描述</param>
83+
/// <returns></returns>
84+
protected virtual ApiActionContext CreateApiActionContext(IHttpApi httpApi, ApiActionDescriptor apiActionDescriptor)
85+
{
86+
return new ApiActionContext(httpApi, this.HttpApiConfig, apiActionDescriptor);
87+
}
88+
7889
/// <summary>
7990
/// 释放资源
8091
/// </summary>

WebApiClient/Internal/Tasks/ApiTask.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Runtime.CompilerServices;
1+
using System;
2+
using System.Runtime.CompilerServices;
23
using System.Threading.Tasks;
34
using WebApiClient.Contexts;
45

@@ -24,19 +25,9 @@ abstract class ApiTask
2425
#endif
2526

2627
/// <summary>
27-
/// 获取或设置httpApi代理类实例
28+
/// 获取或设置上下文创建工厂
2829
/// </summary>
29-
public IHttpApi HttpApi { get; set; }
30-
31-
/// <summary>
32-
/// 获取或设置http接口配置
33-
/// </summary>
34-
public HttpApiConfig HttpApiConfig { get; set; }
35-
36-
/// <summary>
37-
/// 获取或设置api描述
38-
/// </summary>
39-
public ApiActionDescriptor ApiActionDescriptor { get; set; }
30+
public Func<ApiActionContext> ContextFactory { get; set; }
4031

4132
/// <summary>
4233
/// 执行任务
@@ -96,7 +87,7 @@ Task ITask.InvokeAsync()
9687
/// <returns></returns>
9788
public virtual async Task<TResult> InvokeAsync()
9889
{
99-
var context = new ApiActionContext(this.HttpApi, this.HttpApiConfig, this.ApiActionDescriptor);
90+
var context = this.ContextFactory.Invoke();
10091
return await context.ExecuteActionAsync<TResult>().ConfigureAwait(false);
10192
}
10293
}

0 commit comments

Comments
 (0)