Skip to content

Commit

Permalink
移除HttpApiOptions泛型类
Browse files Browse the repository at this point in the history
  • Loading branch information
xljiulang committed Jun 11, 2020
1 parent eb40d90 commit 44fc02c
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 283 deletions.
64 changes: 0 additions & 64 deletions WebApiClientCore.Test/DependencyInjectionExtensionsTest.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static void ConfigureHttpApiTest()
di.ConfigureHttpApi<IDiApi>(o => o.HttpHost = host);
var services = di.BuildServiceProvider();

var options = services.GetService<IOptions<HttpApiOptions<IDiApi>>>().Value;
var options = services.GetService<IOptionsMonitor<HttpApiOptions>>().Get(typeof(IDiApi).FullName);
Assert.True(options.HttpHost == host);
}

Expand All @@ -52,7 +52,7 @@ public static void ConfigureHttpApiNoGenericTest()
di.ConfigureHttpApi(typeof(IDiApi), o => o.HttpHost = host);
var services = di.BuildServiceProvider();

var options = services.GetService<IOptions<HttpApiOptions<IDiApi>>>().Value;
var options = services.GetService<IOptionsMonitor<HttpApiOptions>>().Get(typeof(IDiApi).FullName);
Assert.True(options.HttpHost == host);

Assert.Null(services.GetService<IOptions<HttpApiOptions>>().Value.HttpHost);
Expand Down
10 changes: 0 additions & 10 deletions WebApiClientCore/HttpApiOptions~.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using Microsoft.Extensions.Configuration;
using System;
using WebApiClientCore;

namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// HttpApi配置控制
/// </summary>
public static class HttpApiConfigureExtensions
{
/// <summary>
/// 配置HttpApi
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions> configureOptions)
{
return services.ConfigureHttpApi(typeof(THttpApi), configureOptions);
}

/// <summary>
/// 配置HttpApi
/// </summary>
/// <param name="services"></param>
/// <param name="httpApiType">接口类型</param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi(this IServiceCollection services, Type httpApiType, Action<HttpApiOptions> configureOptions)
{
return services.Configure(httpApiType.FullName, configureOptions);
}

/// <summary>
/// 配置HttpApi
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi<THttpApi>(this IServiceCollection services, IConfiguration configureOptions)
{
return services.ConfigureHttpApi(typeof(THttpApi), configureOptions);
}

/// <summary>
/// 配置HttpApi
/// </summary>
/// <param name="services"></param>
/// <param name="httpApiType">接口类型</param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi(this IServiceCollection services, Type httpApiType, IConfiguration configureOptions)
{
return services.Configure<HttpApiOptions>(httpApiType.FullName, configureOptions);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using System;
using WebApiClientCore;
Expand All @@ -14,88 +13,164 @@ namespace Microsoft.Extensions.DependencyInjection
public static class HttpApiExtensions
{
/// <summary>
/// 尝试注册默认组件
/// 添加HttpApi代理类到服务
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
private static IServiceCollection AddHttpApi(this IServiceCollection services)
/// <returns></returns>
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services) where THttpApi : class
{
services.AddOptions();
services.AddMemoryCache();
services.TryAddSingleton<IXmlSerializer, XmlSerializer>();
services.TryAddSingleton<IJsonSerializer, JsonSerializer>();
services.TryAddSingleton<IKeyValueSerializer, KeyValueSerializer>();
services.TryAddSingleton<IResponseCacheProvider, ResponseCacheProvider>();
return services;

var name = typeof(THttpApi).FullName;
return services
.AddHttpClient(name)
.AddTypedClient((client, serviceProvider) =>
{
var options = serviceProvider.GetRequiredService<IOptionsMonitor<HttpApiOptions>>().Get(name);
return HttpApi.Create<THttpApi>(client, serviceProvider, options);
});
}

/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services) where THttpApi : class
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions> configureOptions) where THttpApi : class
{
return services.AddHttpApi<THttpApi>((o, s) => { });
services
.AddOptions<HttpApiOptions>(typeof(THttpApi).FullName)
.Configure(configureOptions);

return services.AddHttpApi<THttpApi>();
}

/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions"></param>
/// <param name="configureOptions">配置选项</param>
/// <returns></returns>
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions<THttpApi>> configureOptions) where THttpApi : class
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions, IServiceProvider> configureOptions) where THttpApi : class
{
return services.AddHttpApi<THttpApi>((o, s) => configureOptions(o));
services
.AddOptions<HttpApiOptions>(typeof(THttpApi).FullName)
.Configure(configureOptions);

return services.AddHttpApi<THttpApi>();
}


/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <param name="services"></param>
/// <param name="httpApiType">接口类型</param>
/// <exception cref="ArgumentNullException"></exception>
/// <returns></returns>
public static IHttpClientBuilder AddHttpApi(this IServiceCollection services, Type httpApiType)
{
return services.CreateHttpApiBuilder(httpApiType).AddHttpApi();
}

/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions"></param>
/// <param name="httpApiType">接口类型</param>
/// <param name="configureOptions">配置选项</param>
/// <exception cref="ArgumentNullException"></exception>
/// <returns></returns>
public static IHttpClientBuilder AddHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions<THttpApi>, IServiceProvider> configureOptions) where THttpApi : class
public static IHttpClientBuilder AddHttpApi(this IServiceCollection services, Type httpApiType, Action<HttpApiOptions> configureOptions)
{
services
.AddHttpApi()
.AddOptions<HttpApiOptions<THttpApi>>()
.AddOptions<HttpApiOptions>(httpApiType.FullName)
.Configure(configureOptions);

return services
.AddHttpClient(typeof(THttpApi).FullName)
.AddTypedClient((client, serviceProvider) =>
{
var options = serviceProvider.GetRequiredService<IOptions<HttpApiOptions<THttpApi>>>();
return HttpApi.Create<THttpApi>(client, serviceProvider, options.Value);
});
return services.CreateHttpApiBuilder(httpApiType).AddHttpApi();
}


/// <summary>
/// 配置HttpApi
/// 添加HttpApi代理类到服务
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions"></param>
/// <param name="httpApiType">接口类型</param>
/// <param name="configureOptions">配置选项</param>
/// <exception cref="ArgumentNullException"></exception>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi<THttpApi>(this IServiceCollection services, Action<HttpApiOptions<THttpApi>> configureOptions)
public static IHttpClientBuilder AddHttpApi(this IServiceCollection services, Type httpApiType, Action<HttpApiOptions, IServiceProvider> configureOptions)
{
return services.Configure(configureOptions);
services
.AddOptions<HttpApiOptions>(httpApiType.FullName)
.Configure(configureOptions);

return services.CreateHttpApiBuilder(httpApiType).AddHttpApi();
}

/// <summary>
/// 配置HttpApi
/// 创建HttpApiBuilder
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
/// <param name="services"></param>
/// <param name="configureOptions"></param>
/// <param name="httpApiType">接口类型</param>
/// <exception cref="ArgumentNullException"></exception>
/// <returns></returns>
public static IServiceCollection ConfigureHttpApi<THttpApi>(this IServiceCollection services, IConfiguration configureOptions)
private static IHttpApiBuilder CreateHttpApiBuilder(this IServiceCollection services, Type httpApiType)
{
return services.Configure<HttpApiOptions<THttpApi>>(configureOptions);
if (httpApiType == null)
{
throw new ArgumentNullException(nameof(httpApiType));
}

var builderType = typeof(HttpApiBuilder<>).MakeGenericType(httpApiType);
return builderType.CreateInstance<IHttpApiBuilder>(services);
}

/// <summary>
/// 定义httpApi的Builder的行为
/// </summary>
private interface IHttpApiBuilder
{
/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <returns></returns>
IHttpClientBuilder AddHttpApi();
}

/// <summary>
/// httpApi的Builder
/// </summary>
/// <typeparam name="THttpApi"></typeparam>
private class HttpApiBuilder<THttpApi> : IHttpApiBuilder where THttpApi : class
{
private readonly IServiceCollection services;

/// <summary>
/// httpApi的Builder
/// </summary>
/// <param name="services"></param>
public HttpApiBuilder(IServiceCollection services)
{
this.services = services;
}

/// <summary>
/// 添加HttpApi代理类到服务
/// </summary>
/// <returns></returns>
public IHttpClientBuilder AddHttpApi()
{
return this.services.AddHttpApi<THttpApi>();
}
}
}
}
Loading

0 comments on commit 44fc02c

Please sign in to comment.