Skip to content

Commit 029301b

Browse files
committed
为TokenProvider增加别名的功能
1 parent 26227e9 commit 029301b

15 files changed

+208
-80
lines changed

App/Startup.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ public void ConfigureServices(IServiceCollection services)
5252
.UseSourceGeneratorHttpApiActivator();
5353

5454
// 注册userApi
55-
services.AddHttpApi(typeof(IUserApi), o =>
55+
services.AddHttpApi(typeof(IUserApi)).ConfigureHttpApi(o =>
5656
{
5757
o.UseLogging = Environment.IsDevelopment();
5858
o.HttpHost = new Uri("http://localhost:5000/");
5959
});
6060

6161
// 注册与配置clientId模式的token提者选项
62-
services.AddClientCredentialsTokenProvider<IUserApi>(o =>
62+
services.AddClientCredentialsTokenProvider<IUserApi>().Configure(o =>
6363
{
6464
o.Endpoint = new Uri("http://localhost:5000/api/tokens");
6565
o.Credentials.Client_id = "clientId";

Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<PropertyGroup>
99
<Authors>laojiu</Authors>
1010
<Company>laojiu</Company>
11+
<LangVersion>latest</LangVersion>
1112
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1213
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
1314
<PackageLicenseExpression>MIT</PackageLicenseExpression>

WebApiClientCore.Analyzers.SourceGenerator/WebApiClientCore.Analyzers.SourceGenerator.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
<PropertyGroup>
44
<Nullable>enable</Nullable>
5-
<LangVersion>latest</LangVersion>
65
<TargetFramework>netstandard2.0</TargetFramework>
76
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
87

WebApiClientCore.Analyzers/WebApiClientCore.Analyzers.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
<PropertyGroup>
44
<Nullable>enable</Nullable>
5-
<LangVersion>8.0</LangVersion>
65
<TargetFramework>netstandard2.0</TargetFramework>
76
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
87

WebApiClientCore.Extensions.OAuths/Attributes/MultiUserOAuthTokenAttribute.cs renamed to WebApiClientCore.Extensions.OAuths/Attributes/NamedOAuthTokenAttribute.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55
namespace WebApiClientCore.Attributes
66
{
77
/// <summary>
8-
/// 表示支持多用户的token应用特性
8+
/// 表示别名的token应用特性
99
/// </summary>
10-
public class MultiUserOAuthTokenAttribute : OAuthTokenAttribute
10+
public class NamedOAuthTokenAttribute : OAuthTokenAttribute
1111
{
1212
/// <summary>
13-
/// 获取string类型的用户Id参数名
13+
/// 获取token提供者别名的参数名
1414
/// </summary>
15-
public string UserIdParameterName { get; }
15+
public string NameParameterName { get; }
1616

1717
/// <summary>
18-
/// 支持多用户的token应用特性
18+
/// 别名的token应用特性
1919
/// </summary>
20-
/// <param name="userIdParameterName">string类型的用户Id参数名</param>
21-
public MultiUserOAuthTokenAttribute(string userIdParameterName)
20+
/// <param name="nameParameterName">token提供者别名的参数名</param>
21+
public NamedOAuthTokenAttribute(string nameParameterName)
2222
{
23-
this.UserIdParameterName = userIdParameterName;
23+
this.NameParameterName = nameParameterName;
2424
}
2525

2626
/// <summary>
@@ -31,13 +31,13 @@ public MultiUserOAuthTokenAttribute(string userIdParameterName)
3131
/// <exception cref="InvalidOperationException"></exception>
3232
protected sealed override ITokenProvider GetTokenProvider(ApiRequestContext context)
3333
{
34-
if (context.TryGetArgument<string>(this.UserIdParameterName, StringComparer.OrdinalIgnoreCase, out var userId))
34+
if (context.TryGetArgument<string>(this.NameParameterName, StringComparer.OrdinalIgnoreCase, out var name))
3535
{
3636
var tokenProviderFactory = context.HttpContext.ServiceProvider.GetRequiredService<ITokenProviderFactory>();
37-
return tokenProviderFactory.Create(context.ActionDescriptor.InterfaceType, this.TokenProviderSearchMode, userId);
37+
return tokenProviderFactory.Create(context.ActionDescriptor.InterfaceType, this.TokenProviderSearchMode, name);
3838
}
3939

40-
throw new InvalidOperationException($"未提供有效的参数值: {this.UserIdParameterName}");
40+
throw new InvalidOperationException($"未提供有效的参数值: {this.NameParameterName}");
4141
}
4242
}
4343
}

WebApiClientCore.Extensions.OAuths/DependencyInjection/ITokenProviderBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
public interface ITokenProviderBuilder
77
{
88
/// <summary>
9-
/// 获取token提供者的别名
9+
/// 获取token提供者的名称
1010
/// </summary>
1111
string Name { get; }
1212

WebApiClientCore.Extensions.OAuths/DependencyInjection/TokenProviderExtensions.GrantTypeClient.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ public static partial class TokenProviderExtensions
1414
/// </summary>
1515
/// <typeparam name="THttpApi">接口类型</typeparam>
1616
/// <param name="services"></param>
17+
/// <param name="name">token提供者的别名</param>
1718
/// <returns></returns>
18-
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
19-
{
20-
var builder = services.AddTokenProvider<THttpApi, ClientCredentialsTokenProvider>();
19+
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, string name = "")
20+
{
21+
var builder = services.AddTokenProvider<THttpApi, ClientCredentialsTokenProvider>(name);
2122
return new OptionsBuilder<ClientCredentialsOptions>(builder.Services, builder.Name);
2223
}
2324

@@ -26,11 +27,24 @@ public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsToken
2627
/// </summary>
2728
/// <typeparam name="THttpApi">接口类型</typeparam>
2829
/// <param name="services"></param>
29-
/// <param name="configureOptions">配置</param>
30+
/// <param name="configureOptions">配置</param>
3031
/// <returns></returns>
3132
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<ClientCredentialsOptions> configureOptions)
3233
{
3334
return services.AddClientCredentialsTokenProvider<THttpApi>().Configure(configureOptions);
3435
}
36+
37+
/// <summary>
38+
/// 为指定接口添加Client模式的token提供者
39+
/// </summary>
40+
/// <typeparam name="THttpApi">接口类型</typeparam>
41+
/// <param name="services"></param>
42+
/// <param name="name">token提供者的别名</param>
43+
/// <param name="configureOptions">配置</param>
44+
/// <returns></returns>
45+
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, string name, Action<ClientCredentialsOptions> configureOptions)
46+
{
47+
return services.AddClientCredentialsTokenProvider<THttpApi>(name).Configure(configureOptions);
48+
}
3549
}
3650
}

WebApiClientCore.Extensions.OAuths/DependencyInjection/TokenProviderExtensions.GrantTypePassword.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ public static partial class TokenProviderExtensions
1414
/// </summary>
1515
/// <typeparam name="THttpApi">接口类型</typeparam>
1616
/// <param name="services"></param>
17+
/// <param name="name">token提供者的别名</param>
1718
/// <returns></returns>
18-
public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
19+
public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services, string name = "")
1920
{
20-
var builder = services.AddTokenProvider<THttpApi, PasswordCredentialsTokenProvider>();
21+
var builder = services.AddTokenProvider<THttpApi, PasswordCredentialsTokenProvider>(name);
2122
return new OptionsBuilder<PasswordCredentialsOptions>(builder.Services, builder.Name);
2223
}
2324

@@ -32,5 +33,18 @@ public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsT
3233
{
3334
return services.AddPasswordCredentialsTokenProvider<THttpApi>().Configure(configureOptions);
3435
}
36+
37+
/// <summary>
38+
/// 为指定接口添加Password模式的token提供者
39+
/// </summary>
40+
/// <typeparam name="THttpApi">接口类型</typeparam>
41+
/// <param name="services"></param>
42+
/// <param name="name">token提供者的别名</param>
43+
/// <param name="configureOptions">配置</param>
44+
/// <returns></returns>
45+
public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services, string name, Action<PasswordCredentialsOptions> configureOptions)
46+
{
47+
return services.AddPasswordCredentialsTokenProvider<THttpApi>(name).Configure(configureOptions);
48+
}
3549
}
3650
}

WebApiClientCore.Extensions.OAuths/DependencyInjection/TokenProviderExtensions.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ public static partial class TokenProviderExtensions
1818
/// <typeparam name="THttpApi">接口类型</typeparam>
1919
/// <param name="services"></param>
2020
/// <param name="tokenRequest">token请求委托</param>
21+
/// <param name="name">token提供者的别名</param>
2122
/// <returns></returns>
22-
public static ITokenProviderBuilder AddTokenProvider<THttpApi>(this IServiceCollection services, Func<IServiceProvider, Task<TokenResult?>> tokenRequest)
23+
public static ITokenProviderBuilder AddTokenProvider<THttpApi>(this IServiceCollection services, Func<IServiceProvider, Task<TokenResult?>> tokenRequest, string name = "")
2324
{
24-
return services.AddTokenProvider<THttpApi, DelegateTokenProvider>(s => new DelegateTokenProvider(s, tokenRequest));
25+
return services.AddTokenProvider<THttpApi, DelegateTokenProvider>(s => new DelegateTokenProvider(s, tokenRequest), name);
2526
}
2627

2728
/// <summary>
@@ -31,6 +32,7 @@ public static ITokenProviderBuilder AddTokenProvider<THttpApi>(this IServiceColl
3132
/// <typeparam name="TTokenProvider">token提供者类型</typeparam>
3233
/// <param name="services"></param>
3334
/// <param name="tokenProviderFactory">token提供者创建工厂</param>
35+
/// <param name="name">token提供者的别名</param>
3436
/// <returns></returns>
3537
public static ITokenProviderBuilder AddTokenProvider<
3638
#if NET5_0_OR_GREATER
@@ -40,13 +42,13 @@ public static ITokenProviderBuilder AddTokenProvider<
4042
#if NET5_0_OR_GREATER
4143
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
4244
#endif
43-
TTokenProvider>(this IServiceCollection services, Func<IServiceProvider, TTokenProvider> tokenProviderFactory)
45+
TTokenProvider>(this IServiceCollection services, Func<IServiceProvider, TTokenProvider> tokenProviderFactory, string name = "")
4446
where TTokenProvider : class, ITokenProvider
4547
{
4648
return services
4749
.RemoveAll<TTokenProvider>()
4850
.AddTransient(tokenProviderFactory)
49-
.AddTokenProviderCore<THttpApi, TTokenProvider>();
51+
.AddTokenProviderCore<THttpApi, TTokenProvider>(name);
5052
}
5153

5254

@@ -56,6 +58,7 @@ public static ITokenProviderBuilder AddTokenProvider<
5658
/// <typeparam name="THttpApi">接口类型</typeparam>
5759
/// <typeparam name="TTokenProvider">token提供者类型</typeparam>
5860
/// <param name="services"></param>
61+
/// <param name="name">token提供者的别名</param>
5962
/// <returns></returns>
6063
public static ITokenProviderBuilder AddTokenProvider<
6164
#if NET5_0_OR_GREATER
@@ -65,13 +68,13 @@ public static ITokenProviderBuilder AddTokenProvider<
6568
#if NET5_0_OR_GREATER
6669
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
6770
#endif
68-
TTokenProvider>(this IServiceCollection services)
71+
TTokenProvider>(this IServiceCollection services, string name = "")
6972
where TTokenProvider : class, ITokenProvider
7073
{
7174
return services
7275
.RemoveAll<TTokenProvider>()
7376
.AddTransient<TTokenProvider>()
74-
.AddTokenProviderCore<THttpApi, TTokenProvider>();
77+
.AddTokenProviderCore<THttpApi, TTokenProvider>(name);
7578
}
7679

7780

@@ -81,24 +84,25 @@ public static ITokenProviderBuilder AddTokenProvider<
8184
/// <typeparam name="THttpApi">接口类型</typeparam>
8285
/// <typeparam name="TTokenProvider">token提供者类型</typeparam>
8386
/// <param name="services"></param>
87+
/// <param name="name">token提供者的别名</param>
8488
/// <returns></returns>
85-
private static ITokenProviderBuilder AddTokenProviderCore<THttpApi, TTokenProvider>(this IServiceCollection services)
89+
private static ITokenProviderBuilder AddTokenProviderCore<THttpApi, TTokenProvider>(this IServiceCollection services, string name)
8690
where TTokenProvider : class, ITokenProvider
8791
{
8892
services
8993
.AddOptions<TokenProviderFactoryOptions>()
90-
.Configure(o => o.Register<THttpApi, TTokenProvider>());
94+
.Configure(o => o.Register<THttpApi, TTokenProvider>(name));
9195

9296
services
9397
.AddOptions<HttpApiOptions>(HttpApi.GetName(typeof(OAuth2TokenClient)))
9498
.Configure(o => o.KeyValueSerializeOptions.IgnoreNullValues = true);
9599

96100
services.TryAddSingleton<OAuth2TokenClient>();
97-
services.TryAddSingleton(typeof(TokenProviderService<,>));
101+
services.TryAddTransient(typeof(TokenProviderService<,>));
98102
services.TryAddSingleton<ITokenProviderFactory, TokenProviderFactory>();
99103

100-
var name = TokenProviderService<THttpApi, TTokenProvider>.Name;
101-
return new TokenProviderBuilder(name, services);
104+
var providerName = TokenProviderService<THttpApi, TTokenProvider>.GetTokenProviderName(name);
105+
return new TokenProviderBuilder(providerName, services);
102106
}
103107

104108

@@ -108,7 +112,7 @@ private static ITokenProviderBuilder AddTokenProviderCore<THttpApi, TTokenProvid
108112
private class TokenProviderBuilder : ITokenProviderBuilder
109113
{
110114
/// <summary>
111-
/// 获取token提供者的别名
115+
/// 获取token提供者的名称
112116
/// </summary>
113117
public string Name { get; }
114118

@@ -120,7 +124,7 @@ private class TokenProviderBuilder : ITokenProviderBuilder
120124
/// <summary>
121125
/// token提供者创建器
122126
/// </summary>
123-
/// <param name="name">token提供者的别名</param>
127+
/// <param name="name">token提供者的名称</param>
124128
/// <param name="services">服务描述集合</param>
125129
public TokenProviderBuilder(string name, IServiceCollection services)
126130
{

WebApiClientCore.Extensions.OAuths/ITokenProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace WebApiClientCore.Extensions.OAuths
88
public interface ITokenProvider
99
{
1010
/// <summary>
11-
/// 设置别名
11+
/// 设置名称
1212
/// </summary>
1313
string Name { set; }
1414

0 commit comments

Comments
 (0)