Ejemplo n.º 1
0
        /// <summary>
        /// 创建接口的代理实例
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <returns></returns>
        public static object CreateInterfaceProxyWithoutTarget(Type interfaceType, IApiInterceptor interceptor)
        {
            var apiMethods    = interfaceType.GetApiAllMethods();
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(interfaceType, type => GenerateProxyTypeCtor(type, apiMethods));

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 创建接口的代理实例
        /// </summary>
        /// <typeparam name="T">接口殴类型</typeparam>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static T CreateInterfaceProxyWithoutTarget <T>(IApiInterceptor interceptor) where T : class
        {
            var interfaceType = typeof(T);
            var apiMethods    = interfaceType.GetApiAllMethods();
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(interfaceType, type => GenerateProxyTypeCtor(type, apiMethods));

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }) as T);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// http客户端的基类
 /// </summary>
 /// <param name="interceptor">拦截器</param>
 public HttpApiClient(IApiInterceptor interceptor)
 {
     if (interceptor != null)
     {
         this.ApiInterceptor = interceptor;
         this.ApiConfig      = interceptor.ApiConfig;
     }
 }
Ejemplo n.º 4
0
        /// <summary>
        /// 创建HttpApiClient代理类
        /// 并实现指定的接口
        /// </summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static TInterface CreateProxyWithInterface <TInterface>(IApiInterceptor interceptor) where TInterface : class
        {
            var interfaceType = typeof(TInterface);
            var apiMethods    = interfaceType.GetApiAllMethods(typeof(IHttpApiClient), typeof(IDisposable));
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(interfaceType, type => GenerateProxyTypeCtor(type, apiMethods));

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }) as TInterface);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 创建HttpApiClient代理类
        /// 并实现指定的接口
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static object CreateProxyWithInterface(Type interfaceType, IApiInterceptor interceptor)
        {
            var apiMethods    = interfaceType.GetAllApiMethods();
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(
                interfaceType,
                @interface => @interface.ImplementAsHttpApiClient(apiMethods));

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 创建实现了指定接口的HttpApiClient实例
        /// </summary>
        /// <param name="interfaceType">请求接口类型</param>
        /// <param name="apiInterceptor">http接口调用拦截器</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static object Create(Type interfaceType, IApiInterceptor apiInterceptor)
        {
            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }

            if (apiInterceptor == null)
            {
                throw new ArgumentNullException(nameof(apiInterceptor));
            }

            return(HttpApiClientProxy.CreateProxyWithInterface(interfaceType, apiInterceptor));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 创建指定接口的代理实例
        /// 该代理实例派生于HttpApi类型
        /// </summary>
        /// <param name="interfaceType">请求接口类型</param>
        /// <param name="apiInterceptor">http接口调用拦截器</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <exception cref="TypeLoadException"></exception>
        /// <returns></returns>
        public static HttpApi Create(Type interfaceType, IApiInterceptor apiInterceptor)
        {
            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }

            if (apiInterceptor == null)
            {
                throw new ArgumentNullException(nameof(apiInterceptor));
            }

            return(HttpApiProxy.CreateInstance(interfaceType, apiInterceptor));
        }
        /// <summary>
        /// 返回HttpApiClient代理类的实例
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static object CreateInstance(Type interfaceType, IApiInterceptor interceptor)
        {
            // 接口的实现在动态程序集里,所以接口必须为public修饰才可以创建代理类并实现此接口
            if (interfaceType.GetTypeInfo().IsVisible == false)
            {
                var message = $"WebApiClient.JIT不支持非public接口定义:{interfaceType}";
                throw new NotSupportedException(message);
            }

            var apiMethods    = interfaceType.GetAllApiMethods();
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(
                interfaceType,
                @interface => @interface.ImplementAsHttpApiClient(apiMethods));

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 搜索接口的代理类型并实例化
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="TypeLoadException"></exception>
        /// <returns></returns>
        public static HttpApi CreateInstance(Type interfaceType, IApiInterceptor interceptor)
        {
            var httpApiProxy = interfaceProxyCache.GetOrAdd(interfaceType, @interface =>
            {
                var proxyType = FindProxyType(@interface);
                if (proxyType == null)
                {
                    var assemblyName = typeof(HttpApiProxy).GetTypeInfo().Assembly.GetName();
                    throw new TypeLoadException($"找不到接口{interfaceType}的代理类,请为接口所在项目重新使用Nuget安装{assemblyName.Name} {assemblyName.Version}");
                }

                var apiMethods = @interface.GetAllApiMethods();
                return(new HttpApiProxy(proxyType, apiMethods));
            });

            return(httpApiProxy.CreateInstance(interceptor));
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 返回HttpApi代理类的实例
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static HttpApi CreateInstance(Type interfaceType, IApiInterceptor interceptor)
        {
            // 接口的实现在动态程序集里,所以接口必须为public修饰才可以创建代理类并实现此接口
            if (interfaceType.GetTypeInfo().IsVisible == false)
            {
                var message = $"WebApiClient.JIT不支持非public接口定义:{interfaceType}";
                throw new NotSupportedException(message);
            }

            var proxy = interfaceProxyCache.GetOrAdd(interfaceType, @interface =>
            {
                var apiMethods = @interface.GetAllApiMethods();
                var proxyType  = BuildProxyType(@interface, apiMethods);
                return(new HttpApiProxy(proxyType, apiMethods));
            });

            return(proxy.CreateInstance(interceptor));
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 搜索接口的代理类型并实例化
        /// </summary>
        /// <param name="interfaceType">接口类型</param>
        /// <param name="interceptor">拦截器</param>
        /// <exception cref="TypeLoadException"></exception>
        /// <returns></returns>
        public static object CreateInstance(Type interfaceType, IApiInterceptor interceptor)
        {
            var proxyTypeCtor = proxyTypeCtorCache.GetOrAdd(interfaceType, type =>
            {
                var proxyType = FindProxyType(type);
                return(proxyType?.GetConstructor(proxyTypeCtorArgTypes));
            });

            if (proxyTypeCtor == null)
            {
                var assemblyName = typeof(HttpApiClientProxy).GetTypeInfo().Assembly.GetName();
                throw new TypeLoadException($"找不到接口{interfaceType}的代理类,请为接口所在项目重新使用Nuget安装{assemblyName.Name} {assemblyName.Version}");
            }

            var apiMethods = interfaceType.GetAllApiMethods();

            return(proxyTypeCtor.Invoke(new object[] { interceptor, apiMethods }));
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Dcp客户端的基类
 /// </summary>
 /// <param name="apiInterceptor">拦截器</param>
 /// <exception cref="ArgumentNullException"></exception>
 public DcpApiClientProxy(IApiInterceptor apiInterceptor)
 {
     this.ApiInterceptor = apiInterceptor ?? throw new ArgumentNullException(nameof(apiInterceptor));
 }
Ejemplo n.º 13
0
 /// <summary>
 /// 创建新的HttpApi代理实例
 /// </summary>
 /// <param name="interceptor">拦截器</param>
 /// <returns></returns>
 private HttpApi CreateInstance(IApiInterceptor interceptor)
 {
     return(this.proxyFactory.Invoke(interceptor, this.ApiMethods));
 }
 /// <summary>
 /// 调试视图
 /// </summary>
 /// <param name="httpApi">查看的对象</param>
 public DebugView(HttpApi httpApi)
 {
     this.IsDisposed     = httpApi.IsDisposed;
     this.ApiInterceptor = httpApi.ApiInterceptor;
 }
Ejemplo n.º 15
0
 /// <summary>
 /// http接口代理类的基类
 /// </summary>
 /// <param name="apiInterceptor">拦截器</param>
 /// <exception cref="ArgumentNullException"></exception>
 public HttpApi(IApiInterceptor apiInterceptor)
 {
     this.ApiInterceptor = apiInterceptor ?? throw new ArgumentNullException(nameof(apiInterceptor));
 }