using XFEExtension.NetCore.AutoImplement;
using XFEExtension.NetCore.ServerInteractive.Implements;
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 = [];
///
/// 创建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('/');
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 为空");
// 为每个入口点注册服务工厂(区分精确路由和通配符路由)
foreach (var route in entryPointList)
{
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.CyberCommServer.ServerStarted += serverCoreService.ServerStarted;
_xFEServerCore.CyberCommServer.RequestReceived += serverCoreService.RequestReceived;
_xFEServerCore.CyberCommServer.ClientConnected += serverCoreService.ClientConnected;
_xFEServerCore.CyberCommServer.MessageReceived += serverCoreService.MessageReceived;
_xFEServerCore.CyberCommServer.ConnectionClosed += serverCoreService.ConnectionClosed;
}
_xFEServerCore.ServerCoreVerifyServiceList = _serverCoreVerifyServiceList;
_xFEServerCore.StandardCoreServiceDictionary = _serverStandardCoreServiceDictionary;
_xFEServerCore.WildcardCoreServiceList = _serverWildcardCoreServiceList;
if (xFEServerCoreOptions is not null)
{
_xFEServerCore.ServerCoreName = xFEServerCoreOptions.ServerCoreName;
_xFEServerCore.AutoUnescapeJson = xFEServerCoreOptions.AutoUnescapeJson;
_xFEServerCore.AcceptNonStandardJson = xFEServerCoreOptions.AcceptNonStandardJson;
_xFEServerCore.AcceptGet = xFEServerCoreOptions.AcceptGet;
_xFEServerCore.AcceptPost = xFEServerCoreOptions.AcceptPost;
_xFEServerCore.GetIPFunction = xFEServerCoreOptions.GetIPFunction;
_xFEServerCore.MainEntryPoint = xFEServerCoreOptions.MainEntryPoint;
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);
}
}