XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.ServerInteractive

[DLL] Server interaction extension, including user identity verification and querying in conjunction with AutoConfig

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEExtension.NetCore.AutoImplement;
using XFEExtension.NetCore.ServerInteractive.Implements;
using XFEExtension.NetCore.ServerInteractive.Interfaces.Requester;
using XFEExtension.NetCore.ServerInteractive.Models.RequesterModels;
using XFEExtension.NetCore.ServerInteractive.Options;
using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;
using XFEExtension.NetCore.StringExtension;

namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester;

/// <summary>
/// 客户端请求器构建器
/// </summary>
[CreateImpl]
public abstract class ClientRequesterBuilder : XFEBuilderBase<ClientRequesterBuilder>
{
    private readonly ClientRequester _xFEClientRequester = new ClientRequesterImpl();
    private readonly Dictionary<string, Func<IRequestService>> _requestServiceDictionary = [];
    private readonly Dictionary<string, Func<IStandardRequestService>> _standardRequestServiceDictionary = [];
    private readonly List<(string Pattern, Func<IStandardRequestService> Factory)> _wildcardStandardRequestServiceList = [];
    private readonly Dictionary<string, StandardClientInstanceRequest> _standardClientInstanceRequestDictionary = [];
    /// <summary>
    /// 创建构建器
    /// </summary>
    /// <returns></returns>
    public static ClientRequesterBuilder CreateBuilder()
    {
        var builder = new ClientRequesterBuilderImpl();
        builder.AddParameter("XFEClientRequester", builder._xFEClientRequester);
        return builder;
    }

    /// <summary>
    /// 添加请求
    /// </summary>
    /// <typeparam name="T">请求服务泛型</typeparam>
    /// <param name="serviceName">请求名称</param>
    /// <returns></returns>
    public ClientRequesterBuilder AddOriginRequest<T>(string serviceName) where T : IRequestService, new()
    {
        _requestServiceDictionary.Add(serviceName, () =>
        {
            var inst = new T();
            ApplyParameter(inst);
            return inst;
        });
        return this;
    }

    /// <summary>
    /// 注册标准请求服务(从RequestPoints/ResponsePoints/RequestRouteMap自动获取路由路径和名称)
    /// </summary>
    /// <typeparam name="T">请求服务泛型</typeparam>
    /// <returns></returns>
    public ClientRequesterBuilder AddRequest<T>() where T : IStandardRequestService, new()
    {
        var probeService = new T();
        ApplyParameter(probeService);

        var routeKeys = probeService.RequestPoints.Keys
            .Concat(probeService.ResponsePoints.Keys)
            .Concat(probeService.RequestRouteMap.Keys)
            .Distinct()
            .ToList();

        if (routeKeys.Count == 0)
            throw new InvalidOperationException($"类型 {typeof(T).Name} 的 RequestPoints/ResponsePoints/RequestRouteMap 为空,请确保已使用[Request]或[Response]标记方法");

        // 为每个路径/名称注册服务工厂(通配符路径注册到通配符列表,其余注册到标准字典)
        // 对于Name别名,需检查其目标路径是否为通配符:Name→通配符路径不支持,因为无法确定具体请求路径
        foreach (var key in routeKeys)
        {
            if (RouteMatchHelper.IsWildcardRoute(key))
            {
                if (_wildcardStandardRequestServiceList.Any(w => w.Pattern == key))
                    throw new InvalidOperationException($"通配符路由 '{key}' 重复注册");
                _wildcardStandardRequestServiceList.Add((key, () =>
                {
                    var inst = new T();
                    ApplyParameter(inst);
                    return inst;
                }
                ));
            }
            else
            {
                // 检查Name别名是否映射到通配符路径
                if (probeService.RequestRouteMap.TryGetValue(key, out var targetPath) && targetPath != key && RouteMatchHelper.IsWildcardRoute(targetPath))
                    throw new InvalidOperationException($"名称别名 '{key}' 映射到通配符路径 '{targetPath}',不支持通过名称调用通配符路由,请直接使用具体路径进行请求");
                _standardRequestServiceDictionary.Add(key, () =>
                {
                    var inst = new T();
                    ApplyParameter(inst);
                    return inst;
                });
            }
        }
        return this;
    }

    /// <summary>
    /// 添加实例请求
    /// </summary>
    /// <param name="route">路径</param>
    /// <param name="xFEClientInstanceRequest">请求实例</param>
    /// <returns></returns>
    public ClientRequesterBuilder AddRequest(string route, StandardClientInstanceRequest xFEClientInstanceRequest)
    {
        _standardClientInstanceRequestDictionary.Add(route, xFEClientInstanceRequest);
        return this;
    }

    /// <summary>
    /// 添加实例请求
    /// </summary>
    /// <param name="route">路径</param>
    /// <param name="constructBody">构造请求体方法<seealso cref="object"/> (<seealso cref="string"/> session, <seealso cref="string"/> deviceInfo, <seealso cref="object"/>[] parameters)</param>
    /// <param name="processResponse">处理响应方法<seealso cref="object"/> (<seealso cref="string"/> response)</param>
    /// <returns></returns>
    public ClientRequesterBuilder AddRequest(string route, Func<string, string, object[], object> constructBody, Func<string, object>? processResponse = null) => AddRequest(route, new StandardClientInstanceRequest
    {
        ConstructBody = constructBody,
        ProcessResponse = processResponse
    });

    /// <summary>
    /// 使用表格请求器
    /// </summary>
    /// <param name="tableRequester"></param>
    /// <returns></returns>
    public ClientRequesterBuilder UseTableRequester(TableRequester? tableRequester = null)
    {
        tableRequester ??= new();
        _xFEClientRequester.TableRequester = tableRequester;
        return this;
    }

    /// <summary>
    /// 构建XFE客户端请求器
    /// </summary>
    /// <returns>XFE客户端请求器</returns>
    public ClientRequester Build(XFEClientRequesterOptions options)
    {
        _xFEClientRequester.RequestAddress = options.RequestAddress;
        _xFEClientRequester.Session = options.Session;
        _xFEClientRequester.DeviceInfo = options.DeviceInfo;
        if (_xFEClientRequester.TableRequester is not null)
        {
            if (_xFEClientRequester.TableRequester.RequestAddress.NullOrEmpty)
                _xFEClientRequester.TableRequester.RequestAddress = options.RequestAddress;
            if (_xFEClientRequester.TableRequester.DeviceInfo.NullOrEmpty)
                _xFEClientRequester.TableRequester.DeviceInfo = options.DeviceInfo;
            if (_xFEClientRequester.TableRequester.Session.NullOrEmpty)
                _xFEClientRequester.TableRequester.Session = options.Session;
        }
        _xFEClientRequester.RequestServiceDictionary = _requestServiceDictionary;
        _xFEClientRequester.StandardRequestServiceDictionary = _standardRequestServiceDictionary;
        _xFEClientRequester.WildcardStandardRequestServiceList = _wildcardStandardRequestServiceList;
        _xFEClientRequester.StandardClientInstanceRequestDictionary = _standardClientInstanceRequestDictionary;
        return _xFEClientRequester;
    }

    /// <summary>
    /// 构建XFE客户端请求器
    /// </summary>
    /// <returns>XFE客户端请求器</returns>
    public ClientRequester Build(Action<XFEClientRequesterOptions> optionsBuilder)
    {
        var options = new XFEClientRequesterOptions();
        optionsBuilder(options);
        return Build(options);
    }
}