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));
        }
Exemple #3
0
        /// <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提供者");
        }
Exemple #4
0
        /// <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);
 }
Exemple #6
0
        /// <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>());
        }
Exemple #7
0
 /// <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));
 }