diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApplicationApiDescriptionModelManager.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs similarity index 90% rename from src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApplicationApiDescriptionModelManager.cs rename to src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs index 79cac746e5..4fc370a2e2 100644 --- a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApplicationApiDescriptionModelManager.cs +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs @@ -9,14 +9,14 @@ using Volo.Abp.Http.Modeling; namespace Volo.Abp.Http.Client.DynamicProxying { - public class ApplicationApiDescriptionModelManager : IApplicationApiDescriptionModelManager, ISingletonDependency + public class ApiDescriptionCache : IApiDescriptionCache, ISingletonDependency { private readonly IDynamicProxyHttpClientFactory _httpClientFactory; private readonly Dictionary _cache; private readonly AsyncLock _asyncLock; - public ApplicationApiDescriptionModelManager(IDynamicProxyHttpClientFactory httpClientFactory) + public ApiDescriptionCache(IDynamicProxyHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs new file mode 100644 index 0000000000..4ad80a516c --- /dev/null +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs @@ -0,0 +1,65 @@ +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Modeling; + +namespace Volo.Abp.Http.Client.DynamicProxying +{ + public class ApiDescriptionFinder : IApiDescriptionFinder, ISingletonDependency + { + private readonly IApiDescriptionCache _descriptionCache; + + public ApiDescriptionFinder(IApiDescriptionCache descriptionCache) + { + _descriptionCache = descriptionCache; + } + + public async Task FindActionAsync(DynamicHttpClientProxyConfig proxyConfig, MethodInfo method) + { + var apiDescription = await _descriptionCache.GetAsync(proxyConfig.BaseUrl); + + var methodParameters = method.GetParameters().ToArray(); + + foreach (var module in apiDescription.Modules.Values) + { + if (module.Name != proxyConfig.ModuleName) + { + continue; + } + + foreach (var controller in module.Controllers.Values) + { + if (controller.Interfaces.All(i => i.TypeAsString != proxyConfig.Type.FullName)) + { + continue; + } + + foreach (var action in controller.Actions.Values) + { + if (action.NameOnClass == method.Name && action.ParametersOnMethod.Count == methodParameters.Length) + { + var found = true; + + for (int i = 0; i < methodParameters.Length; i++) + { + if (action.ParametersOnMethod[i].TypeAsString != methodParameters[i].ParameterType.FullName) + { + found = false; + break; + } + } + + if (found) + { + return action; + } + } + } + } + } + + throw new AbpException("Could not found remote action for method: " + method); + } + } +} diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index 4538b1ba19..1fdae184de 100644 --- a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying private static MethodInfo GenericInterceptAsyncMethod { get; } private readonly IDynamicProxyHttpClientFactory _httpClientFactory; - private readonly IApplicationApiDescriptionModelManager _discoverManager; + private readonly IApiDescriptionFinder _apiDescriptionFinder; private readonly AbpHttpClientOptions _options; static DynamicHttpProxyInterceptor() @@ -30,10 +30,10 @@ namespace Volo.Abp.Http.Client.DynamicProxying public DynamicHttpProxyInterceptor( IDynamicProxyHttpClientFactory httpClientFactory, IOptions options, - IApplicationApiDescriptionModelManager discoverManager) + IApiDescriptionFinder apiDescriptionFinder) { _httpClientFactory = httpClientFactory; - _discoverManager = discoverManager; + _apiDescriptionFinder = apiDescriptionFinder; _options = options.Value; } @@ -54,8 +54,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying private async Task InterceptAsync(IAbpMethodInvocation invocation) { var proxyConfig = GetProxyConfig(); - var apiDescription = await _discoverManager.GetAsync(proxyConfig.BaseUrl); - var actionApiDescription = FindAction(apiDescription, invocation.Method, proxyConfig); + var actionApiDescription = await _apiDescriptionFinder.FindActionAsync(proxyConfig, invocation.Method); using (var client = _httpClientFactory.Create()) { @@ -81,59 +80,8 @@ namespace Volo.Abp.Http.Client.DynamicProxying private DynamicHttpClientProxyConfig GetProxyConfig() { - var config = _options.HttpClientProxies.GetOrDefault(typeof(TService)); - if (config == null) - { - throw new AbpException($"Could not get DynamicHttpClientProxyConfig for {typeof(TService).FullName}."); - } - return config; - } - - private static ActionApiDescriptionModel FindAction(ApplicationApiDescriptionModel apiDescriptionModel, MethodInfo method, DynamicHttpClientProxyConfig config) - { - //TODO: Move to another class and cache results! - - var methodParameters = method.GetParameters().ToArray(); - - foreach (var module in apiDescriptionModel.Modules.Values) - { - if (module.Name != config.ModuleName) - { - continue; - } - - foreach (var controller in module.Controllers.Values) - { - if (controller.Interfaces.All(i => i.TypeAsString != typeof(TService).FullName)) - { - continue; - } - - foreach (var action in controller.Actions.Values) - { - if (action.NameOnClass == method.Name && action.ParametersOnMethod.Count == methodParameters.Length) - { - var found = true; - - for (int i = 0; i < methodParameters.Length; i++) - { - if (action.ParametersOnMethod[i].TypeAsString != methodParameters[i].ParameterType.FullName) - { - found = false; - break; - } - } - - if (found) - { - return action; - } - } - } - } - } - - throw new AbpException("Could not found remote action for method: " + method); + return _options.HttpClientProxies.GetOrDefault(typeof(TService)) + ?? throw new AbpException($"Could not get DynamicHttpClientProxyConfig for {typeof(TService).FullName}."); } } } \ No newline at end of file diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApplicationApiDescriptionModelManager.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionCache.cs similarity index 82% rename from src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApplicationApiDescriptionModelManager.cs rename to src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionCache.cs index bdc7f3d6af..98f02bdabd 100644 --- a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApplicationApiDescriptionModelManager.cs +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionCache.cs @@ -4,7 +4,7 @@ using Volo.Abp.Http.Modeling; namespace Volo.Abp.Http.Client.DynamicProxying { - public interface IApplicationApiDescriptionModelManager + public interface IApiDescriptionCache { Task GetAsync(string baseUrl, CancellationToken cancellationToken = default(CancellationToken)); } diff --git a/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs new file mode 100644 index 0000000000..87c3b783ac --- /dev/null +++ b/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs @@ -0,0 +1,11 @@ +using System.Reflection; +using System.Threading.Tasks; +using Volo.Abp.Http.Modeling; + +namespace Volo.Abp.Http.Client.DynamicProxying +{ + public interface IApiDescriptionFinder + { + Task FindActionAsync(DynamicHttpClientProxyConfig proxyConfig, MethodInfo invocationMethod); + } +} \ No newline at end of file