/// <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 })); }
/// <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); }
/// <summary> /// http客户端的基类 /// </summary> /// <param name="interceptor">拦截器</param> public HttpApiClient(IApiInterceptor interceptor) { if (interceptor != null) { this.ApiInterceptor = interceptor; this.ApiConfig = interceptor.ApiConfig; } }
/// <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); }
/// <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 })); }
/// <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)); }
/// <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 })); }
/// <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)); }
/// <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)); }
/// <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 })); }
/// <summary> /// Dcp客户端的基类 /// </summary> /// <param name="apiInterceptor">拦截器</param> /// <exception cref="ArgumentNullException"></exception> public DcpApiClientProxy(IApiInterceptor apiInterceptor) { this.ApiInterceptor = apiInterceptor ?? throw new ArgumentNullException(nameof(apiInterceptor)); }
/// <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; }
/// <summary> /// http接口代理类的基类 /// </summary> /// <param name="apiInterceptor">拦截器</param> /// <exception cref="ArgumentNullException"></exception> public HttpApi(IApiInterceptor apiInterceptor) { this.ApiInterceptor = apiInterceptor ?? throw new ArgumentNullException(nameof(apiInterceptor)); }