ApiProxyScriptManager.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.Collections.Concurrent;
  2. using Abp.Collections.Extensions;
  3. using Abp.Dependency;
  4. using Abp.Extensions;
  5. using Abp.Json;
  6. using Abp.Web.Api.Modeling;
  7. using Abp.Web.Api.ProxyScripting.Configuration;
  8. using Abp.Web.Api.ProxyScripting.Generators;
  9. namespace Abp.Web.Api.ProxyScripting
  10. {
  11. public class ApiProxyScriptManager : IApiProxyScriptManager, ISingletonDependency
  12. {
  13. private readonly IApiDescriptionModelProvider _modelProvider;
  14. private readonly IApiProxyScriptingConfiguration _configuration;
  15. private readonly IIocResolver _iocResolver;
  16. private readonly ConcurrentDictionary<string, string> _cache;
  17. public ApiProxyScriptManager(
  18. IApiDescriptionModelProvider modelProvider,
  19. IApiProxyScriptingConfiguration configuration,
  20. IIocResolver iocResolver)
  21. {
  22. _modelProvider = modelProvider;
  23. _configuration = configuration;
  24. _iocResolver = iocResolver;
  25. _cache = new ConcurrentDictionary<string, string>();
  26. }
  27. public string GetScript(ApiProxyGenerationOptions options)
  28. {
  29. if (options.UseCache)
  30. {
  31. return _cache.GetOrAdd(CreateCacheKey(options), (key) => CreateScript(options));
  32. }
  33. return _cache[CreateCacheKey(options)] = CreateScript(options);
  34. }
  35. private string CreateScript(ApiProxyGenerationOptions options)
  36. {
  37. var model = _modelProvider.CreateModel();
  38. if (options.IsPartialRequest())
  39. {
  40. model = model.CreateSubModel(options.Modules, options.Controllers, options.Actions);
  41. }
  42. var generatorType = _configuration.Generators.GetOrDefault(options.GeneratorType);
  43. if (generatorType == null)
  44. {
  45. throw new AbpException($"Could not find a proxy script generator with given name: {options.GeneratorType}");
  46. }
  47. using (var generator = _iocResolver.ResolveAsDisposable<IProxyScriptGenerator>(generatorType))
  48. {
  49. return generator.Object.CreateScript(model);
  50. }
  51. }
  52. private static string CreateCacheKey(ApiProxyGenerationOptions options)
  53. {
  54. return options.ToJsonString().ToMd5();
  55. }
  56. }
  57. }