Skip to content

Commit be35ba6

Browse files
committedJun 10, 2021
增加全局配置HttpApiOptions
1 parent 4fb100e commit be35ba6

File tree

2 files changed

+154
-2
lines changed

2 files changed

+154
-2
lines changed
 

‎WebApiClientCore.Test/Microsoft.Extensions/DependencyInjection/DependencyInjectionTest.cs

+27-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public static void ConfigureHttpApiTest()
4141
var name = HttpApi.GetName(typeof(IDiApi));
4242
var options = services.GetService<IOptionsMonitor<HttpApiOptions>>().Get(name);
4343
Assert.True(options.HttpHost == host);
44-
}
44+
}
4545

4646
[Fact]
4747
public static void ConfigureHttpApiNoGenericTest()
@@ -60,6 +60,32 @@ public static void ConfigureHttpApiNoGenericTest()
6060
}
6161

6262

63+
[Fact]
64+
public static void ConfigureHttpApiWithDefaultTest()
65+
{
66+
var di = new ServiceCollection();
67+
var host = new Uri("http://www.x.com");
68+
di.AddHttpApi<IDiApi>();
69+
di.ConfigureHttpApi<IDiApi>(o =>
70+
{
71+
o.HttpHost = host;
72+
Assert.True(o.UseParameterPropertyValidate == false);
73+
Assert.True(o.UseReturnValuePropertyValidate == true);
74+
});
75+
di.AddWebApiClient().ConfigureHttpApi(o =>
76+
{
77+
o.UseParameterPropertyValidate = false;
78+
o.UseReturnValuePropertyValidate = true;
79+
});
80+
var services = di.BuildServiceProvider();
81+
82+
var name = HttpApi.GetName(typeof(IDiApi));
83+
var options = services.GetService<IOptionsMonitor<HttpApiOptions>>().Get(name);
84+
Assert.True(options.HttpHost == host);
85+
Assert.True(options.UseParameterPropertyValidate == false);
86+
Assert.True(options.UseReturnValuePropertyValidate == true);
87+
}
88+
6389
public interface IDiApi
6490
{
6591
}

‎WebApiClientCore/DependencyInjection/WebApiClientBuilderExtensions.cs

+127-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
using Microsoft.Extensions.DependencyInjection.Extensions;
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.DependencyInjection.Extensions;
3+
using Microsoft.Extensions.Options;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
27
using WebApiClientCore;
38
using WebApiClientCore.Implementations;
49

@@ -24,6 +29,7 @@ public static IWebApiClientBuilder AddWebApiClient(this IServiceCollection servi
2429
{
2530
services.AddOptions();
2631
services.AddMemoryCache();
32+
services.TryAddTransient<IOptionsFactory<HttpApiOptions>, HttpApiOptionsFactory>();
2733

2834
services.TryAddSingleton(typeof(IHttpApiActivator<>), typeof(DefaultHttpApiActivator<>));
2935
services.TryAddSingleton<IApiActionDescriptorProvider, DefaultApiActionDescriptorProvider>();
@@ -45,6 +51,42 @@ public static IWebApiClientBuilder UseJsonFirstApiActionDescriptor(this IWebApiC
4551
return builder;
4652
}
4753

54+
/// <summary>
55+
/// 配置HttpApiOptions的默认值
56+
/// </summary>
57+
/// <param name="builder"></param>
58+
/// <param name="configureOptions">配置选项</param>
59+
/// <returns></returns>
60+
public static IWebApiClientBuilder ConfigureHttpApi(this IWebApiClientBuilder builder, Action<HttpApiOptions, IServiceProvider> configureOptions)
61+
{
62+
builder.Services.AddOptions<HttpApiOptions>().Configure(configureOptions);
63+
return builder;
64+
}
65+
66+
/// <summary>
67+
/// 配置HttpApiOptions的默认值
68+
/// </summary>
69+
/// <param name="builder"></param>
70+
/// <param name="configureOptions">配置选项</param>
71+
/// <returns></returns>
72+
public static IWebApiClientBuilder ConfigureHttpApi(this IWebApiClientBuilder builder, Action<HttpApiOptions> configureOptions)
73+
{
74+
builder.Services.AddOptions<HttpApiOptions>().Configure(configureOptions);
75+
return builder;
76+
}
77+
78+
/// <summary>
79+
/// 配置HttpApiOptions的默认值
80+
/// </summary>
81+
/// <param name="builder"></param>
82+
/// <param name="configuration">配置</param>
83+
/// <returns></returns>
84+
public static IWebApiClientBuilder ConfigureHttpApi(this IWebApiClientBuilder builder, IConfiguration configuration)
85+
{
86+
builder.Services.AddOptions<HttpApiOptions>().Bind(configuration);
87+
return builder;
88+
}
89+
4890
/// <summary>
4991
/// WebApiClient全局配置的Builder
5092
/// </summary>
@@ -60,5 +102,89 @@ public WebApiClientBuilder(IServiceCollection services)
60102
this.Services = services;
61103
}
62104
}
105+
106+
/// <summary>
107+
/// HttpApiOptions工厂
108+
/// </summary>
109+
private class HttpApiOptionsFactory : IOptionsFactory<HttpApiOptions>
110+
{
111+
private readonly IConfigureOptions<HttpApiOptions>[] _setups;
112+
private readonly IPostConfigureOptions<HttpApiOptions>[] _postConfigures;
113+
private readonly IValidateOptions<HttpApiOptions>[] _validations;
114+
115+
/// <summary>
116+
/// HttpApiOptions工厂
117+
/// </summary>
118+
/// <param name="setups"></param>
119+
/// <param name="postConfigures"></param>
120+
/// <param name="validations"></param>
121+
public HttpApiOptionsFactory(IEnumerable<IConfigureOptions<HttpApiOptions>> setups, IEnumerable<IPostConfigureOptions<HttpApiOptions>> postConfigures, IEnumerable<IValidateOptions<HttpApiOptions>> validations)
122+
{
123+
_setups = setups as IConfigureOptions<HttpApiOptions>[] ?? setups.ToArray();
124+
_postConfigures = postConfigures as IPostConfigureOptions<HttpApiOptions>[] ?? postConfigures.ToArray();
125+
_validations = validations as IValidateOptions<HttpApiOptions>[] ?? validations.ToArray();
126+
}
127+
128+
/// <summary>
129+
/// 创建Options
130+
/// </summary>
131+
/// <param name="name"></param>
132+
/// <returns></returns>
133+
public HttpApiOptions Create(string name)
134+
{
135+
var defaultOptions = this.Create(Options.Options.DefaultName, default);
136+
return this.Create(name, defaultOptions);
137+
}
138+
139+
/// <summary>
140+
/// 创建Options
141+
/// </summary>
142+
/// <param name="name"></param>
143+
/// <param name="options">传入的实例</param>
144+
/// <returns></returns>
145+
private HttpApiOptions Create(string name, HttpApiOptions? options)
146+
{
147+
if (options == null)
148+
{
149+
options = new HttpApiOptions();
150+
}
151+
152+
foreach (var setup in _setups)
153+
{
154+
if (setup is IConfigureNamedOptions<HttpApiOptions> namedSetup)
155+
{
156+
namedSetup.Configure(name, options);
157+
}
158+
else if (name == Options.Options.DefaultName)
159+
{
160+
setup.Configure(options);
161+
}
162+
}
163+
164+
foreach (var post in _postConfigures)
165+
{
166+
post.PostConfigure(name, options);
167+
}
168+
169+
if (_validations != null)
170+
{
171+
var failures = new List<string>();
172+
foreach (var validate in _validations)
173+
{
174+
var result = validate.Validate(name, options);
175+
if (result != null && result.Failed)
176+
{
177+
failures.AddRange(result.Failures);
178+
}
179+
}
180+
if (failures.Count > 0)
181+
{
182+
throw new OptionsValidationException(name, typeof(HttpApiOptions), failures);
183+
}
184+
}
185+
186+
return options;
187+
}
188+
}
63189
}
64190
}

0 commit comments

Comments
 (0)
Please sign in to comment.