public CacheKey(Type httpApiType, TypeMatchMode typeMatchMode, string name) { this.HttpApiType = httpApiType; this.TypeMatchMode = typeMatchMode; this.Name = name; this.hashCode = HashCode.Combine(httpApiType, typeMatchMode, name); }
/// <summary> /// 通过接口类型获取或创建其对应的token提供者 /// </summary> /// <param name="httpApiType">接口类型</param> /// <param name="typeMatchMode">类型匹配模式</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> public ITokenProvider Create(Type httpApiType, TypeMatchMode typeMatchMode) { if (httpApiType == null) { throw new ArgumentNullException(nameof(httpApiType)); } var cacheKey = new CacheKey(httpApiType, typeMatchMode); return(this.tokenProviderCache.GetOrAdd(cacheKey, this.GetTokenProvider)); }
/// <summary> /// 通过接口类型获取或创建其对应的token提供者 /// </summary> /// <param name="httpApiType">接口类型</param> /// <param name="typeMatchMode">类型匹配模式</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> public ITokenProvider Create(Type httpApiType, TypeMatchMode typeMatchMode) { if (httpApiType == null) { throw new ArgumentNullException(nameof(httpApiType)); } if (this.options.TryGetValue(httpApiType, out var serviceType)) { var service = this.serviceProvider.GetRequiredService(serviceType); return(((ITokenProviderService)service).TokenProvider); } if (typeMatchMode == TypeMatchMode.TypeOrBaseTypes) { return(this.GetTokenProviderFromBaseType(httpApiType)); } throw new InvalidOperationException($"尚未注册{httpApiType}的token提供者"); }
/// <summary> /// 创建token提供者 /// </summary> /// <param name="httpApiType">接口类型</param> /// <param name="typeMatchMode">类型匹配模式</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> public ITokenProvider Create(Type httpApiType, TypeMatchMode typeMatchMode) { if (httpApiType == null) { throw new ArgumentNullException(nameof(httpApiType)); } if (typeMatchMode == TypeMatchMode.TypeOnly) { return(this.Create(httpApiType)); } if (this.CanCreate(httpApiType) == false) { var baseType = httpApiType.GetInterfaces().FirstOrDefault(i => this.CanCreate(i)); if (baseType != null) { httpApiType = baseType; } } return(this.Create(httpApiType)); }
public CacheKey(Type httpApiType, TypeMatchMode typeMatchMode) { this.HttpApiType = httpApiType; this.TypeMatchMode = typeMatchMode; this.hashCode = HashCode.Combine(this.HttpApiType, this.TypeMatchMode); }
/// <summary> /// 添加token应用的http消息处理程序 /// </summary> /// <typeparam name="TOAuthTokenHandler"></typeparam> /// <param name="builder"></param> /// <param name="handlerFactory">hanlder的创建委托</param> /// <param name="tokenProviderSearchMode">token提供者的查找模式</param> /// <returns></returns> public static IHttpClientBuilder AddOAuthTokenHandler <TOAuthTokenHandler>(this IHttpClientBuilder builder, Func <IServiceProvider, ITokenProvider, TOAuthTokenHandler> handlerFactory, TypeMatchMode tokenProviderSearchMode = TypeMatchMode.TypeOrBaseTypes) where TOAuthTokenHandler : OAuthTokenHandler { var httpApiType = builder.GetHttpApiType(); if (httpApiType == null) { throw new InvalidOperationException($"无效的{nameof(IHttpClientBuilder)},找不到其关联的http接口类型"); } builder.Services.TryAddTransient(serviceProvider => { var factory = serviceProvider.GetRequiredService <ITokenProviderFactory>(); var tokenProvider = factory.Create(httpApiType, tokenProviderSearchMode); return(handlerFactory(serviceProvider, tokenProvider)); }); return(builder.AddHttpMessageHandler <TOAuthTokenHandler>()); }
/// <summary> /// 添加token应用的http消息处理程序 /// </summary> /// <param name="builder"></param> /// <param name="tokenProviderSearchMode">token提供者的查找模式</param> /// <returns></returns> public static IHttpClientBuilder AddOAuthTokenHandler(this IHttpClientBuilder builder, TypeMatchMode tokenProviderSearchMode = TypeMatchMode.TypeOrBaseTypes) { return(builder.AddOAuthTokenHandler((s, t) => new OAuthTokenHandler(t), tokenProviderSearchMode)); }
/// <summary> /// 通过接口类型获取或创建其对应的token提供者 /// </summary> /// <param name="httpApiType">接口类型</param> /// <param name="typeMatchMode">类型匹配模式</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException"></exception> public ITokenProvider Create(Type httpApiType, TypeMatchMode typeMatchMode) { return(this.Create(httpApiType, typeMatchMode, name: string.Empty)); }