Files
WebView2Demo/WebView2Demo/WebInterop/MainSystemGateway.cs
T
2026-03-11 22:25:30 +08:00

102 lines
3.5 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Threading.Tasks;
using WebView2Demo.Models;
namespace WebView2Demo.WebInterop
{
/// <summary>
/// 前后端互操作主网关类 [反射分发, 统一回包]
/// </summary>
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class MainSystemGateway
{
private readonly ApiRouteManager _routeManager;
private readonly JsonSerializerOptions _jsonOptions = new()
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
PropertyNameCaseInsensitive = true,
WriteIndented = false
};
public MainSystemGateway()
{
// 初始化路由管理器
_routeManager = new ApiRouteManager(_jsonOptions);
}
/// <summary>
/// 统一 API 调用入口 (前端唯一调用的方法)
/// 遵循 COM 规范,接收 string 并返回 string
/// </summary>
public async Task<string> InvokeAction(string requestJson)
{
// 这里我们调用内部泛型处理逻辑,T 使用 JsonElement 作为通用基类
return await ProcessRequestInternal<JsonElement>(requestJson);
}
/// <summary>
/// 内部泛型处理逻辑:在这里进行真正的协议解析和分发
/// </summary>
/// <typeparam name="T">请求数据的泛型类型</typeparam>
private async Task<string> ProcessRequestInternal<T>(string requestJson)
{
try
{
// 1. 解析请求信封 (进入泛型世界)
var request = JsonSerializer.Deserialize<StandardApiRequest<T>>(requestJson, _jsonOptions);
if (request == null || string.IsNullOrWhiteSpace(request.Action))
{
return MakeErrorResponse("请求 JSON 格式错误或 Action 缺失");
}
// 2. 路由分发 (通过反射查找 Service 和 Method 并执行)
// 注意:由于 ApiRouteManager 内部处理了 JsonElement 的动态解析,这里我们传入 Data 即可
JsonElement rawData = request.Data is JsonElement element ? element : default;
var (data, msg) = await _routeManager.DispatchActionAsync(request.Action, rawData);
// 3. 根据结果统一回包
if (data == null && msg.Contains("未找到"))
{
return MakeErrorResponse(msg);
}
return MakeSuccessResponse(data!, msg);
}
catch (Exception ex)
{
return MakeErrorResponse($"网关内部崩溃: {ex.Message}");
}
}
#region [ ]
private string MakeSuccessResponse(object data, string msg = "操作成功")
{
var response = new StandardApiResponse
{
Success = true,
Message = msg,
Data = data
};
return JsonSerializer.Serialize(response, _jsonOptions);
}
private string MakeErrorResponse(string msg)
{
var response = new StandardApiResponse
{
Success = false,
Message = msg,
Data = null
};
return JsonSerializer.Serialize(response, _jsonOptions);
}
#endregion
}
}