using XFEExtension.NetCore.AutoImplement;
using XFEExtension.NetCore.ServerInteractive.Implements;
using System.Collections.Frozen;
using XFEExtension.NetCore.ServerInteractive.Implements.CoreService;
using XFEExtension.NetCore.ServerInteractive.Interfaces.CoreService;
using XFEExtension.NetCore.ServerInteractive.Options;
using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;
using XFEExtension.NetCore.StringExtension;
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Server;
///
/// XFE服务器核心构建器
///
[CreateImpl]
public abstract class XFEServerCoreBuilder : XFEBuilderBase
{
private static int s_serverCount = 1;
private readonly XFEServerCore _xFEServerCore = new XFEServerCoreImpl();
private readonly List _serverCoreServiceList = [];
private readonly List> _serverCoreVerifyServiceList = [];
private readonly Dictionary> _serverStandardCoreServiceDictionary = [];
private readonly List<(string Pattern, Func Factory)> _serverWildcardCoreServiceList = [];
private readonly HashSet _noLogEntryPointSet = [];
///
/// 创建XFE服务器核心构建器
///
///
public static XFEServerCoreBuilder CreateBuilder()
{
var builder = new XFEServerCoreBuilderImpl();
builder.AddParameter("XFEServerCore", builder._xFEServerCore);
return builder;
}
///
/// 添加服务
///
/// 服务对象
/// XFE服务器核心构建器
public XFEServerCoreBuilder AddOriginalService(IServerCoreOriginalService serverCoreRegisterService)
{
ApplyParameter(serverCoreRegisterService);
_serverCoreServiceList.Add(serverCoreRegisterService);
return this;
}
///
/// 添加服务
///
/// 服务泛型
/// XFE服务器核心构建器
public XFEServerCoreBuilder AddOriginalService() where T : IServerCoreOriginalService, new() => AddOriginalService(new T());
///
/// 添加校验服务
///
/// 校验服务泛型
/// XFE服务器核心构建器
public XFEServerCoreBuilder AddVerifyService() where T : IServerCoreVerifyService, new()
{
_serverCoreVerifyServiceList.Add(() =>
{
var inst = new T();
ApplyParameter(inst);
return inst;
});
return this;
}
///
/// 注册标准服务(手动指定路由路径,适用于动态路由的服务)
///
/// 服务泛型
/// 路由路径
/// XFE服务器核心构建器
public XFEServerCoreBuilder AddServiceWithRoute(string route) where T : IServerCoreStandardService, new()
{
ArgumentException.ThrowIfNullOrWhiteSpace(route);
route = route.Trim('/');
RouteMatchHelper.ValidatePattern(route);
Func factory = () =>
{
var inst = new T();
ApplyParameter(inst);
return inst;
};
if (RouteMatchHelper.IsWildcardRoute(route))
{
if (_serverWildcardCoreServiceList.Any(entry => entry.Pattern == route))
throw new InvalidOperationException($"通配符路由 '{route}' 已重复注册(服务类型:{typeof(T).Name})");
_serverWildcardCoreServiceList.Add((route, factory));
}
else
{
_serverStandardCoreServiceDictionary.Add(route, factory);
}
return this;
}
///
/// 注册标准服务(从EntryPointList自动获取路由路径)
///
/// 服务泛型
/// XFE服务器核心构建器
public XFEServerCoreBuilder AddService() where T : IServerCoreStandardService, new()
{
var probeService = new T();
ApplyParameter(probeService);
var entryPointList = probeService.SyncEntryPoints.Keys
.Concat(probeService.AsyncEntryPoints.Keys)
.Distinct()
.ToList();
if (entryPointList is null || entryPointList.Count == 0)
throw new InvalidOperationException($"类型 {typeof(T).Name} 的 EntryPointList 为空");
var noLogEntryPoints = probeService is ServerCoreStandardServiceBase standardService
? standardService.NoLogEntryPoints
: [];
// 为每个入口点注册服务工厂(区分精确路由和通配符路由)
foreach (var route in entryPointList)
{
RouteMatchHelper.ValidatePattern(route);
if (noLogEntryPoints.Contains(route))
_noLogEntryPointSet.Add(route);
Func factory = () =>
{
var inst = new T();
ApplyParameter(inst);
return inst;
};
if (RouteMatchHelper.IsWildcardRoute(route))
{
if (_serverWildcardCoreServiceList.Any(entry => entry.Pattern == route))
throw new InvalidOperationException($"通配符路由 '{route}' 已重复注册(服务类型:{typeof(T).Name})");
_serverWildcardCoreServiceList.Add((route, factory));
}
else
{
_serverStandardCoreServiceDictionary.Add(route, factory);
}
}
return this;
}
///
/// 构建XFE服务器核心
///
/// XFE服务器核心
public XFEServerCore Build(XFEServerCoreOptions? xFEServerCoreOptions = null)
{
foreach (var serverCoreService in _serverCoreServiceList)
{
_xFEServerCore.ServerCoreServiceList.Add(serverCoreService);
}
_xFEServerCore.ServerCoreVerifyServiceList = _serverCoreVerifyServiceList.ToArray();
_xFEServerCore.StandardCoreServiceDictionary = _serverStandardCoreServiceDictionary.ToFrozenDictionary(StringComparer.Ordinal);
_xFEServerCore.WildcardCoreServiceList = _serverWildcardCoreServiceList.ToArray();
_xFEServerCore.NoLogEntryPointSet = _noLogEntryPointSet.ToFrozenSet(StringComparer.Ordinal);
if (xFEServerCoreOptions is not null)
{
_xFEServerCore.ServerCoreName = xFEServerCoreOptions.ServerCoreName;
_xFEServerCore.AcceptNonStandardJson = xFEServerCoreOptions.AcceptNonStandardJson;
_xFEServerCore.AcceptGet = xFEServerCoreOptions.AcceptGet;
_xFEServerCore.AcceptPost = xFEServerCoreOptions.AcceptPost;
_xFEServerCore.GetIPFunction = xFEServerCoreOptions.GetIPFunction;
_xFEServerCore.MainEntryPoint = XFEServerCore.NormalizeMainEntryPoint(xFEServerCoreOptions.MainEntryPoint);
_xFEServerCore.TransportLimits = xFEServerCoreOptions.TransportLimits;
_xFEServerCore.TlsOptions = xFEServerCoreOptions.Tls;
if (xFEServerCoreOptions.BindingIPAddress.Count > 0)
_xFEServerCore.BindingIPAddressList = xFEServerCoreOptions.BindingIPAddress;
}
if (_xFEServerCore.ServerCoreName.IsNullOrEmpty())
_xFEServerCore.ServerCoreName = $"XFE服务器-{s_serverCount++}";
return _xFEServerCore;
}
///
/// 构建XFE服务器核心
///
/// XFE服务器核心
public XFEServerCore Build(Action optionsBuilder)
{
var xFEServerCoreOptions = new XFEServerCoreOptions();
optionsBuilder(xFEServerCoreOptions);
return Build(xFEServerCoreOptions);
}
}