feat: 动态API支持直接执行已有的应用逻辑

This commit is contained in:
wintel 2025-03-30 18:01:22 +08:00
parent d42be4d7c9
commit dfbb150f9b
4 changed files with 106 additions and 25 deletions

View File

@ -18,11 +18,13 @@ namespace OpenAuth.App
{
private readonly ISqlSugarClient _client;
private readonly IAuth _auth;
private readonly IServiceProvider _serviceProvider;
public DynamicApiApp(ISqlSugarClient client, IAuth auth)
public DynamicApiApp(ISqlSugarClient client, IAuth auth, IServiceProvider serviceProvider)
{
_client = client;
_auth = auth;
_serviceProvider = serviceProvider;
}
/// <summary>
@ -337,6 +339,27 @@ namespace OpenAuth.App
{
return _client.DbMaintenance.GetColumnInfosByTableName(tableName);
}
/// <summary>
/// 调用OpenAuth.App的各种应用
/// </summary>
/// <param name="req">调用参数</param>
/// <returns></returns>
public TableData Invoke(InvokeDynamicReq req)
{
// 获取服务实例
var serviceType = Type.GetType($"OpenAuth.App.{req.ServiceName}");
var service = _serviceProvider.GetService(serviceType);
// 获取并调用方法
var method = serviceType.GetMethod(req.MethodName);
var result = method.Invoke(service, new[] { req.Parameters });
return new TableData
{
data = result,
};
}
}
/// <summary>

View File

@ -0,0 +1,21 @@
namespace OpenAuth.App.Request
{
public class InvokeDynamicReq
{
/// <summary>
/// 服务名称,如OpenAuth.App.MoudleApp
/// </summary>
public string ServiceName { get; set; }
/// <summary>
/// 方法名称,如Add
/// </summary>
public string MethodName { get; set; }
/// <summary>
/// 参数,如:{ "Id": 1, "Name": "test" }
/// </summary>
public object Parameters { get; set; }
}
}

View File

@ -73,5 +73,15 @@ namespace OpenAuth.App.Test
var obj = await app.Delete(new DelDynamicReq() { TableName = "noentity", Ids = new string[] { "10" } });
Console.WriteLine(JsonHelper.Instance.Serialize(obj));
}
[Test]
public void TestInvoke()
{
var app = _autofacServiceProvider.GetService<DynamicApiApp>();
var obj = app.Invoke(new InvokeDynamicReq { ServiceName = "UserManagerApp", MethodName = "GetParent",
Parameters = new { userid = "0ceff0f8-f848-440c-bc26-d8605ac858cd" } });
Console.WriteLine(JsonHelper.Instance.Serialize(obj));
}
}
}

View File

@ -11,7 +11,7 @@ namespace OpenAuth.WebApi.Controllers
{
/// <summary>
/// 动态API控制器
/// 用于处理任意表的CRUD操作
/// 用于处理任意表的CRUD操作及直接调用OpenAuth.App的各种应用
/// </summary>
[Route("api/dynamic/[action]")]
[ApiController]
@ -25,6 +25,8 @@ namespace OpenAuth.WebApi.Controllers
_app = app;
}
/// <summary>
/// 获取表数据列表
/// </summary>
@ -145,5 +147,30 @@ namespace OpenAuth.WebApi.Controllers
return result;
}
/// <summary>
/// 直接调用OpenAuth.App的各种应用
/// </summary>
/// <param name="req">调用参数</param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public TableData Invoke([FromBody] InvokeDynamicReq req)
{
var result = new TableData();
try
{
result = _app.Invoke(req);
}
catch (Exception ex)
{
result.code = 500;
result.msg = ex.InnerException?.Message ?? ex.Message;
}
return result;
}
}
}