Skip to content

Commit c982510

Browse files
committed
增加mediaType比较器
1 parent c238c6c commit c982510

File tree

5 files changed

+68
-9
lines changed

5 files changed

+68
-9
lines changed

WebApiClientCore/ApiActionDescriptor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ public ApiActionDescriptor(MethodInfo method, Type? interfaceType = default)
9393
var actionAttributes = methodAttributes
9494
.Concat(interfaceAttributes)
9595
.Concat(decalringAttributes)
96-
.Distinct(new MultiplableComparer<IApiActionAttribute>())
96+
.Distinct(MultiplableComparer<IApiActionAttribute>.Default)
9797
.OrderBy(item => item.OrderIndex)
9898
.ToReadOnlyList();
9999

100100
var filterAttributes = method
101101
.GetAttributes<IApiFilterAttribute>(true)
102-
.Distinct(new MultiplableComparer<IApiFilterAttribute>())
102+
.Distinct(MultiplableComparer<IApiFilterAttribute>.Default)
103103
.OrderBy(item => item.OrderIndex)
104104
.Where(item => item.Enable)
105105
.ToReadOnlyList();

WebApiClientCore/ApiReturnDescriptor.cs

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class ApiReturnDescriptor
2222
/// <summary>
2323
/// 获取ITask(Of T)或Task(Of T)的T类型描述
2424
/// </summary>
25-
public ApiDataTypeDescriptor DataType { get; }
25+
public ApiDataTypeDescriptor DataType { get; }
2626

2727
/// <summary>
2828
/// 获取关联的IApiReturnAttribute
@@ -48,13 +48,15 @@ public ApiReturnDescriptor(MethodInfo method)
4848
var dataType = new ApiDataTypeDescriptor(type);
4949

5050
this.ReturnType = method.ReturnType;
51-
this.DataType = dataType;
51+
this.DataType = dataType;
5252
this.Attributes = method
5353
.GetAttributes<IApiReturnAttribute>(true)
5454
.Concat(GetDefaultAttributes(dataType))
55-
.Distinct(new MultiplableComparer<IApiReturnAttribute>())
55+
.Distinct(MultiplableComparer<IApiReturnAttribute>.Default)
5656
.OrderBy(item => item.OrderIndex)
5757
.Where(item => item.Enable)
58+
// 最后步骤为比较媒体类型
59+
.Distinct(MediaTypeComparer.Default)
5860
.ToReadOnlyList();
5961
}
6062

@@ -79,5 +81,51 @@ private static IEnumerable<IApiReturnAttribute> GetDefaultAttributes(ApiDataType
7981
yield return new RawReturnAttribute(acceptQuality);
8082
}
8183
}
84+
85+
86+
/// <summary>
87+
/// MediaType比较器
88+
/// </summary>
89+
private class MediaTypeComparer : IEqualityComparer<IApiReturnAttribute>
90+
{
91+
/// <summary>
92+
/// 获取默认实例
93+
/// </summary>
94+
public static MediaTypeComparer Default { get; } = new MediaTypeComparer();
95+
96+
/// <summary>
97+
/// 是否相等
98+
/// </summary>
99+
/// <param name="x"></param>
100+
/// <param name="y"></param>
101+
/// <returns></returns>
102+
public bool Equals(IApiReturnAttribute x, IApiReturnAttribute y)
103+
{
104+
var xVal = x.AcceptContentType?.MediaType;
105+
var yVal = y.AcceptContentType?.MediaType;
106+
107+
// 允许多个无AcceptContentType的ApiReturnAttribute存在
108+
if (xVal == null && yVal == null)
109+
{
110+
return false;
111+
}
112+
113+
return string.Equals(xVal, yVal, StringComparison.OrdinalIgnoreCase);
114+
}
115+
116+
/// <summary>
117+
/// 获取哈希码
118+
/// </summary>
119+
/// <param name="obj"></param>
120+
/// <returns></returns>
121+
public int GetHashCode(IApiReturnAttribute obj)
122+
{
123+
if (obj.AcceptContentType == null)
124+
{
125+
return 0;
126+
}
127+
return obj.AcceptContentType.MediaType.GetHashCode();
128+
}
129+
}
82130
}
83131
}

WebApiClientCore/Attributes/ReturnAttributes/ApiReturnAttribute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class ApiReturnAttribute : Attribute, IApiReturnAttribute
1616
/// <summary>
1717
/// 获取接受的媒体类型
1818
/// </summary>
19-
protected MediaTypeWithQualityHeaderValue? AcceptContentType { get; }
19+
public MediaTypeWithQualityHeaderValue? AcceptContentType { get; }
2020

2121
/// <summary>
2222
/// 获取执行排序索引
@@ -99,7 +99,7 @@ public async Task OnResponseAsync(ApiResponseContext context)
9999
}
100100

101101
/// <summary>
102-
/// 指示响应的ContentType与Accept-ContentType是否匹配
102+
/// 指示响应的ContentType与AcceptContentType是否匹配
103103
/// 返回false则调用下一个ApiReturnAttribute来处理响应结果
104104
/// </summary>
105105
/// <param name="responseContentType">响应的ContentType</param>

WebApiClientCore/BuildinUtils/MultiplableComparer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ namespace WebApiClientCore
55
/// <summary>
66
/// 是否允许重复的特性比较器
77
/// </summary>
8-
class MultiplableComparer<TAttributeMultiplable> : IEqualityComparer<TAttributeMultiplable> where TAttributeMultiplable : IAttributeMultiplable
8+
sealed class MultiplableComparer<TAttributeMultiplable> : IEqualityComparer<TAttributeMultiplable> where TAttributeMultiplable : IAttributeMultiplable
99
{
10+
/// <summary>
11+
/// 获取默认实例
12+
/// </summary>
13+
public static MultiplableComparer<TAttributeMultiplable> Default { get; } = new MultiplableComparer<TAttributeMultiplable>();
14+
1015
/// <summary>
1116
/// 是否相等
1217
/// </summary>

WebApiClientCore/IApiReturnAttribute.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System.Net.Http.Headers;
2+
using System.Threading.Tasks;
23

34
namespace WebApiClientCore
45
{
@@ -7,6 +8,11 @@ namespace WebApiClientCore
78
/// </summary>
89
public interface IApiReturnAttribute : IAttributeMultiplable, IAttributeEnable
910
{
11+
/// <summary>
12+
/// 获取期望的媒体类型
13+
/// </summary>
14+
MediaTypeWithQualityHeaderValue? AcceptContentType { get; }
15+
1016
/// <summary>
1117
/// 请求前
1218
/// </summary>

0 commit comments

Comments
 (0)