-
Notifications
You must be signed in to change notification settings - Fork 446
/
Copy pathTokenProviderFactoryOptions.cs
94 lines (85 loc) · 3.15 KB
/
TokenProviderFactoryOptions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace WebApiClientCore.Extensions.OAuths
{
/// <summary>
/// 用于记录接口类型与TokenProviderService的映射关系
/// </summary>
sealed class TokenProviderFactoryOptions
{
/// <summary>
/// httpApi的服务描述映射
/// </summary>
private readonly Dictionary<Type, AliasServiceDescriptor> httpApiServiceDescriptors = [];
/// <summary>
/// 登记映射
/// </summary>
/// <typeparam name="THttpApi">接口类型</typeparam>
/// <typeparam name="TTokenProvider">提供者类型</typeparam>
/// <param name="alias">TokenProvider的别名</param>
public void Register<THttpApi, TTokenProvider>(string alias) where TTokenProvider : ITokenProvider
{
var httpApiType = typeof(THttpApi);
var serviceType = typeof(TokenProviderService<THttpApi, TTokenProvider>);
if (this.httpApiServiceDescriptors.TryGetValue(httpApiType, out var existDescriptor) &&
existDescriptor.ServiceType == serviceType)
{
existDescriptor.AddAlias(alias);
}
else
{
var serviceDescriptor = new AliasServiceDescriptor(serviceType, alias);
this.httpApiServiceDescriptors[httpApiType] = serviceDescriptor;
}
}
/// <summary>
/// 尝试获取服务描述值
/// </summary>
/// <param name="httpApiType">接口类型</param>
/// <param name="descriptor">TokenProviderService的描述</param>
/// <returns></returns>
public bool TryGetValue(Type httpApiType, [MaybeNullWhen(false)] out AliasServiceDescriptor descriptor)
{
return this.httpApiServiceDescriptors.TryGetValue(httpApiType, out descriptor);
}
/// <summary>
/// 别名的服务描述
/// </summary>
public class AliasServiceDescriptor
{
private readonly HashSet<string> aliasSet;
/// <summary>
/// 获取服务类型
/// </summary>
public Type ServiceType { get; }
/// <summary>
/// 别名的服务描述
/// </summary>
/// <param name="serviceType">服务类型</param>
/// <param name="alias"></param>
public AliasServiceDescriptor(Type serviceType, string alias)
{
this.ServiceType = serviceType;
this.aliasSet = [alias];
}
/// <summary>
/// 添加别名
/// </summary>
/// <param name="alias"></param>
public void AddAlias(string alias)
{
this.aliasSet.Add(alias);
}
/// <summary>
/// 是否存在别名
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
public bool ContainsAlias(string alias)
{
return this.aliasSet.Contains(alias);
}
}
}
}