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); } }