From 60ff0218ec6f588c70ba2433be1ae84d2999e6ad Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Mar 2026 12:57:50 +0800 Subject: [PATCH] feat: Refactor API scripting and model provider to support asynchronous operations --- .../Mvc/ApiExploring/AbpApiDefinitionController.cs | 2 +- .../Mvc/AspNetCoreApiDescriptionModelProvider.cs | 5 ----- .../AbpServiceProxyScriptController.cs | 7 ++++--- .../Http/Modeling/IApiDescriptionModelProvider.cs | 5 +---- .../Abp/Http/ProxyScripting/IProxyScriptManager.cs | 4 +++- .../Http/ProxyScripting/IProxyScriptManagerCache.cs | 2 ++ .../Abp/Http/ProxyScripting/ProxyScriptManager.cs | 13 +++++++------ .../Http/ProxyScripting/ProxyScriptManagerCache.cs | 5 +++++ 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs index 413bddcc3a..1cf47ddb64 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpApiDefinitionController.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Http.Modeling; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index da42052821..7960b9319a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -51,11 +51,6 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide Logger = NullLogger.Instance; } - public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input) - { - return AsyncHelper.RunSync(() => CreateApiModelAsync(input)); - } - public virtual async Task CreateApiModelAsync(ApplicationApiDescriptionModelRequestDto input) { //TODO: Can cache the model? diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxyScriptController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxyScriptController.cs index ef7196fb0c..49881e103d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxyScriptController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ProxyScripting/AbpServiceProxyScriptController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Volo.Abp.Auditing; using Volo.Abp.Http; @@ -29,11 +30,11 @@ public class AbpServiceProxyScriptController : AbpController [HttpGet] [Produces(MimeTypes.Application.Javascript, MimeTypes.Text.Plain)] - public virtual ActionResult GetAll(ServiceProxyGenerationModel model) + public virtual async Task GetAll(ServiceProxyGenerationModel model) { model.Normalize(); - var script = ProxyScriptManager.GetScript(model.CreateOptions()); + var script = await ProxyScriptManager.GetScriptAsync(model.CreateOptions()); return Content( Options.MinifyGeneratedScript == true diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs index b985a2df76..107e68008f 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/IApiDescriptionModelProvider.cs @@ -4,8 +4,5 @@ namespace Volo.Abp.Http.Modeling; public interface IApiDescriptionModelProvider { - ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input); - - Task CreateApiModelAsync(ApplicationApiDescriptionModelRequestDto input) - => Task.FromResult(CreateApiModel(input)); + Task CreateApiModelAsync(ApplicationApiDescriptionModelRequestDto input); } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManager.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManager.cs index a39f96e35a..193936d1a3 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManager.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManager.cs @@ -1,6 +1,8 @@ +using System.Threading.Tasks; + namespace Volo.Abp.Http.ProxyScripting; public interface IProxyScriptManager { - string GetScript(ProxyScriptingModel scriptingModel); + Task GetScriptAsync(ProxyScriptingModel scriptingModel); } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManagerCache.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManagerCache.cs index e08a608905..74149251e0 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManagerCache.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/IProxyScriptManagerCache.cs @@ -6,5 +6,7 @@ public interface IProxyScriptManagerCache { string GetOrAdd(string key, Func factory); + bool TryGet(string key, out string? value); + void Set(string key, string value); } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs index c8fd93c220..11bb25a1fe 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -32,23 +33,23 @@ public class ProxyScriptManager : IProxyScriptManager, ITransientDependency _options = options.Value; } - public string GetScript(ProxyScriptingModel scriptingModel) + public async Task GetScriptAsync(ProxyScriptingModel scriptingModel) { var cacheKey = CreateCacheKey(scriptingModel); - if (scriptingModel.UseCache) + if (scriptingModel.UseCache && _cache.TryGet(cacheKey, out var cached)) { - return _cache.GetOrAdd(cacheKey, () => CreateScript(scriptingModel)); + return cached!; } - var script = CreateScript(scriptingModel); + var script = await CreateScriptAsync(scriptingModel); _cache.Set(cacheKey, script); return script; } - private string CreateScript(ProxyScriptingModel scriptingModel) + private async Task CreateScriptAsync(ProxyScriptingModel scriptingModel) { - var apiModel = _modelProvider.CreateApiModel(new ApplicationApiDescriptionModelRequestDto { IncludeTypes = false }); + var apiModel = await _modelProvider.CreateApiModelAsync(new ApplicationApiDescriptionModelRequestDto { IncludeTypes = false }); if (scriptingModel.IsPartialRequest()) { diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManagerCache.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManagerCache.cs index 9bfe12e86f..67c1b39d7f 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManagerCache.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManagerCache.cs @@ -19,6 +19,11 @@ public class ProxyScriptManagerCache : IProxyScriptManagerCache, ISingletonDepen return _cache.GetOrAdd(key, factory); } + public bool TryGet(string key, out string? value) + { + return _cache.TryGetValue(key, out value); + } + public void Set(string key, string value) { _cache[key] = value;