Browse Source

Refactored.

pull/113/head
Halil İbrahim Kalkan 9 years ago
parent
commit
7464b40066
  1. 4
      src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs
  2. 65
      src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
  3. 64
      src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
  4. 2
      src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionCache.cs
  5. 11
      src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApiDescriptionFinder.cs

4
src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApplicationApiDescriptionModelManager.cs → 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<string, ApplicationApiDescriptionModel> _cache;
private readonly AsyncLock _asyncLock;
public ApplicationApiDescriptionModelManager(IDynamicProxyHttpClientFactory httpClientFactory)
public ApiDescriptionCache(IDynamicProxyHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;

65
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<ActionApiDescriptionModel> 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);
}
}
}

64
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<AbpHttpClientOptions> 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<T> InterceptAsync<T>(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}.");
}
}
}

2
src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/IApplicationApiDescriptionModelManager.cs → 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<ApplicationApiDescriptionModel> GetAsync(string baseUrl, CancellationToken cancellationToken = default(CancellationToken));
}

11
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<ActionApiDescriptionModel> FindActionAsync(DynamicHttpClientProxyConfig proxyConfig, MethodInfo invocationMethod);
}
}
Loading…
Cancel
Save