using GFramework.Core.Abstractions.architecture; using GFramework.Core.Abstractions.enums; using GFramework.Core.Abstractions.environment; using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.lifecycle; using GFramework.Core.Abstractions.logging; using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; using GFramework.Core.environment; using GFramework.Core.extensions; using GFramework.Core.logging; using Microsoft.Extensions.DependencyInjection; namespace GFramework.Core.architecture; /// /// 架构基类,提供系统、模型、工具等组件的注册与管理功能。 /// 专注于生命周期管理、初始化流程控制和架构阶段转换。 /// public abstract class Architecture( IArchitectureConfiguration? configuration = null, IEnvironment? environment = null, IArchitectureServices? services = null, IArchitectureContext? context = null ) : IArchitecture { #region Module Management /// /// 注册中介行为管道 /// 用于配置Mediator框架的行为拦截和处理逻辑 /// /// 行为类型,必须是引用类型 public void RegisterMediatorBehavior() where TBehavior : class { _logger.Debug($"Registering mediator behavior: {typeof(TBehavior).Name}"); Container.RegisterMediatorBehavior(); } /// /// 安装架构模块 /// /// 要安装的模块 /// 安装的模块实例 public IArchitectureModule InstallModule(IArchitectureModule module) { var name = module.GetType().Name; var logger = LoggerFactoryResolver.Provider.CreateLogger(name); logger.Debug($"Installing module: {name}"); module.Install(this); logger.Info($"Module installed: {name}"); return module; } #endregion #region Properties /// /// 获取架构配置对象 /// private IArchitectureConfiguration Configuration { get; } = configuration ?? new ArchitectureConfiguration(); /// /// 获取环境配置对象 /// private IEnvironment Environment { get; } = environment ?? new DefaultEnvironment(); private IArchitectureServices Services { get; } = services ?? new ArchitectureServices(); /// /// 获取依赖注入容器 /// private IIocContainer Container => Services.Container; /// /// 当前架构的阶段 /// public ArchitecturePhase CurrentPhase { get; private set; } /// /// 架构上下文 /// public IArchitectureContext Context => _context!; #endregion #region Fields private readonly TaskCompletionSource _readyTcs = new(TaskCreationOptions.RunContinuationsAsynchronously); /// /// 获取一个布尔值,指示当前架构是否处于就绪状态。 /// 当前架构的阶段等于 ArchitecturePhase.Ready 时返回 true,否则返回 false。 /// public bool IsReady => CurrentPhase == ArchitecturePhase.Ready; /// /// 待初始化组件的去重集合。 /// 用于存储需要初始化的组件实例,确保每个组件仅被初始化一次。 /// private readonly HashSet _pendingInitializableSet = []; /// /// 存储所有待初始化的组件(统一管理,保持注册顺序) /// private readonly List _pendingInitializableList = []; /// /// 可销毁组件的去重集合(支持 IDestroyable 和 IAsyncDestroyable) /// private readonly HashSet _disposableSet = []; /// /// 存储所有需要销毁的组件(统一管理,保持注册逆序销毁) /// private readonly List _disposables = []; /// /// 生命周期感知对象列表 /// private readonly List _lifecycleHooks = []; /// /// 标记架构是否已初始化完成 /// private bool _mInitialized; /// /// 日志记录器实例 /// private ILogger _logger = null!; /// /// 架构上下文实例 /// private IArchitectureContext? _context = context; #endregion #region Lifecycle Management /// /// 进入指定的架构阶段,并执行相应的生命周期管理操作 /// /// 要进入的下一个架构阶段 /// 当阶段转换不被允许时抛出异常 protected virtual void EnterPhase(ArchitecturePhase next) { // 验证阶段转换 ValidatePhaseTransition(next); // 执行阶段转换 var previousPhase = CurrentPhase; CurrentPhase = next; if (previousPhase != next) _logger.Info($"Architecture phase changed: {previousPhase} -> {next}"); // 通知阶段变更 NotifyPhase(next); NotifyPhaseAwareObjects(next); } /// /// 验证阶段转换是否合法 /// /// 目标阶段 /// 当阶段转换不合法时抛出 private void ValidatePhaseTransition(ArchitecturePhase next) { // 不需要严格验证,直接返回 if (!Configuration.ArchitectureProperties.StrictPhaseValidation) return; // FailedInitialization 可以从任何阶段转换,直接返回 if (next == ArchitecturePhase.FailedInitialization) return; // 检查转换是否在允许列表中 if (ArchitectureConstants.PhaseTransitions.TryGetValue(CurrentPhase, out var allowed) && allowed.Contains(next)) return; // 转换不合法,抛出异常 var errorMsg = $"Invalid phase transition: {CurrentPhase} -> {next}"; _logger.Fatal(errorMsg); throw new InvalidOperationException(errorMsg); } /// /// 通知所有架构阶段感知对象阶段变更 /// /// 新阶段 private void NotifyPhaseAwareObjects(ArchitecturePhase phase) { foreach (var obj in Container.GetAll()) { _logger.Trace($"Notifying phase-aware object {obj.GetType().Name} of phase change to {phase}"); obj.OnArchitecturePhase(phase); } } /// /// 通知所有生命周期钩子当前阶段变更 /// /// 当前架构阶段 private void NotifyPhase(ArchitecturePhase phase) { foreach (var hook in _lifecycleHooks) { hook.OnPhase(phase, this); _logger.Trace($"Notifying lifecycle hook {hook.GetType().Name} of phase {phase}"); } } /// /// 注册生命周期钩子 /// /// 生命周期钩子实例 /// 注册的钩子实例 public IArchitectureLifecycleHook RegisterLifecycleHook(IArchitectureLifecycleHook hook) { if (CurrentPhase >= ArchitecturePhase.Ready && !Configuration.ArchitectureProperties.AllowLateRegistration) throw new InvalidOperationException( "Cannot register lifecycle hook after architecture is Ready"); _lifecycleHooks.Add(hook); return hook; } /// /// 统一的组件生命周期注册逻辑 /// /// 要注册的组件 private void RegisterLifecycleComponent(T component) { // 处理初始化 if (component is IInitializable initializable) { if (!_mInitialized) { // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在) if (_pendingInitializableSet.Add(initializable)) { _pendingInitializableList.Add(initializable); _logger.Trace($"Added {component.GetType().Name} to pending initialization queue"); } } else { throw new InvalidOperationException( "Cannot initialize component after Architecture is Ready"); } } // 处理销毁(支持 IDestroyable 或 IAsyncDestroyable) if (component is not (IDestroyable or IAsyncDestroyable)) return; // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在) if (!_disposableSet.Add(component)) return; _disposables.Add(component); _logger.Trace($"Registered {component.GetType().Name} for destruction"); } /// /// 初始化所有待初始化的组件 /// /// 是否使用异步模式 private async Task InitializeAllComponentsAsync(bool asyncMode) { _logger.Info($"Initializing {_pendingInitializableList.Count} components"); // 按类型分组初始化(保持原有的阶段划分) var utilities = _pendingInitializableList.OfType().ToList(); var models = _pendingInitializableList.OfType().ToList(); var systems = _pendingInitializableList.OfType().ToList(); // 1. 工具初始化阶段(始终进入阶段,仅在有组件时执行初始化) EnterPhase(ArchitecturePhase.BeforeUtilityInit); if (utilities.Count != 0) { _logger.Info($"Initializing {utilities.Count} context utilities"); foreach (var utility in utilities) { _logger.Debug($"Initializing utility: {utility.GetType().Name}"); await InitializeComponentAsync(utility, asyncMode); } _logger.Info("All context utilities initialized"); } EnterPhase(ArchitecturePhase.AfterUtilityInit); // 2. 模型初始化阶段(始终进入阶段,仅在有组件时执行初始化) EnterPhase(ArchitecturePhase.BeforeModelInit); if (models.Count != 0) { _logger.Info($"Initializing {models.Count} models"); foreach (var model in models) { _logger.Debug($"Initializing model: {model.GetType().Name}"); await InitializeComponentAsync(model, asyncMode); } _logger.Info("All models initialized"); } EnterPhase(ArchitecturePhase.AfterModelInit); // 3. 系统初始化阶段(始终进入阶段,仅在有组件时执行初始化) EnterPhase(ArchitecturePhase.BeforeSystemInit); if (systems.Count != 0) { _logger.Info($"Initializing {systems.Count} systems"); foreach (var system in systems) { _logger.Debug($"Initializing system: {system.GetType().Name}"); await InitializeComponentAsync(system, asyncMode); } _logger.Info("All systems initialized"); } EnterPhase(ArchitecturePhase.AfterSystemInit); _pendingInitializableList.Clear(); _pendingInitializableSet.Clear(); _logger.Info("All components initialized"); } /// /// 异步初始化单个组件 /// /// 要初始化的组件 /// 是否使用异步模式 private static async Task InitializeComponentAsync(IInitializable component, bool asyncMode) { if (asyncMode && component is IAsyncInitializable asyncInit) await asyncInit.InitializeAsync(); else component.Initialize(); } /// /// 抽象初始化方法,由子类重写以进行自定义初始化操作 /// protected abstract void OnInitialize(); /// /// 异步销毁架构及所有组件 /// public virtual async ValueTask DestroyAsync() { // 检查当前阶段,如果已经处于销毁或已销毁状态则直接返回 if (CurrentPhase >= ArchitecturePhase.Destroying) { _logger.Warn("Architecture destroy called but already in destroying/destroyed state"); return; } // 进入销毁阶段 _logger.Info("Starting architecture destruction"); EnterPhase(ArchitecturePhase.Destroying); // 销毁所有实现了 IAsyncDestroyable 或 IDestroyable 的组件(按注册逆序销毁) _logger.Info($"Destroying {_disposables.Count} disposable components"); for (var i = _disposables.Count - 1; i >= 0; i--) { var component = _disposables[i]; try { _logger.Debug($"Destroying component: {component.GetType().Name}"); // 优先使用异步销毁 if (component is IAsyncDestroyable asyncDestroyable) { await asyncDestroyable.DestroyAsync(); } else if (component is IDestroyable destroyable) { destroyable.Destroy(); } } catch (Exception ex) { _logger.Error($"Error destroying {component.GetType().Name}", ex); // 继续销毁其他组件,不会因为一个组件失败而中断 } } _disposables.Clear(); _disposableSet.Clear(); // 销毁服务模块 await Services.ModuleManager.DestroyAllAsync(); Container.Clear(); // 进入已销毁阶段 EnterPhase(ArchitecturePhase.Destroyed); _logger.Info("Architecture destruction completed"); } /// /// 销毁架构并清理所有组件资源(同步方法,保留用于向后兼容) /// [Obsolete("建议使用 DestroyAsync() 以支持异步清理")] public virtual void Destroy() { DestroyAsync().AsTask().GetAwaiter().GetResult(); } #endregion #region Component Registration /// /// 验证是否允许注册组件 /// /// 组件类型描述 /// 当不允许注册时抛出 private void ValidateRegistration(string componentType) { if (CurrentPhase < ArchitecturePhase.Ready || Configuration.ArchitectureProperties.AllowLateRegistration) return; var errorMsg = $"Cannot register {componentType} after Architecture is Ready"; _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } /// /// 注册一个系统到架构中。 /// 若当前未初始化,则暂存至待初始化列表;否则立即初始化该系统。 /// /// 要注册的系统类型,必须实现ISystem接口 /// 要注册的系统实例 /// 注册成功的系统实例 public TSystem RegisterSystem(TSystem system) where TSystem : ISystem { ValidateRegistration("system"); _logger.Debug($"Registering system: {typeof(TSystem).Name}"); system.SetContext(Context); Container.RegisterPlurality(system); // 处理生命周期 RegisterLifecycleComponent(system); _logger.Info($"System registered: {typeof(TSystem).Name}"); return system; } /// /// 注册系统类型,由 DI 容器自动创建实例 /// /// 系统类型 /// 可选的实例创建后回调,用于自定义配置 public void RegisterSystem(Action? onCreated = null) where T : class, ISystem { ValidateRegistration("system"); _logger.Debug($"Registering system type: {typeof(T).Name}"); Container.RegisterFactory(sp => { // 1. DI 创建实例 var system = ActivatorUtilities.CreateInstance(sp); // 2. 框架默认处理 system.SetContext(Context); RegisterLifecycleComponent(system); // 3. 用户自定义处理(钩子) onCreated?.Invoke(system); _logger.Debug($"System created: {typeof(T).Name}"); return system; }); _logger.Info($"System type registered: {typeof(T).Name}"); } /// /// 注册一个模型到架构中。 /// 若当前未初始化,则暂存至待初始化列表;否则立即初始化该模型。 /// /// 要注册的模型类型,必须实现IModel接口 /// 要注册的模型实例 /// 注册成功的模型实例 public TModel RegisterModel(TModel model) where TModel : IModel { ValidateRegistration("model"); _logger.Debug($"Registering model: {typeof(TModel).Name}"); model.SetContext(Context); Container.RegisterPlurality(model); // 处理生命周期 RegisterLifecycleComponent(model); _logger.Info($"Model registered: {typeof(TModel).Name}"); return model; } /// /// 注册模型类型,由 DI 容器自动创建实例 /// /// 模型类型 /// 可选的实例创建后回调,用于自定义配置 public void RegisterModel(Action? onCreated = null) where T : class, IModel { ValidateRegistration("model"); _logger.Debug($"Registering model type: {typeof(T).Name}"); Container.RegisterFactory(sp => { var model = ActivatorUtilities.CreateInstance(sp); model.SetContext(Context); RegisterLifecycleComponent(model); // 用户自定义钩子 onCreated?.Invoke(model); _logger.Debug($"Model created: {typeof(T).Name}"); return model; }); _logger.Info($"Model type registered: {typeof(T).Name}"); } /// /// 注册一个工具到架构中 /// /// 要注册的工具类型,必须实现IUtility接口 /// 要注册的工具实例 /// 注册成功的工具实例 public TUtility RegisterUtility(TUtility utility) where TUtility : IUtility { _logger.Debug($"Registering utility: {typeof(TUtility).Name}"); // 处理上下文工具类型的设置和生命周期管理 utility.IfType(contextUtility => { contextUtility.SetContext(Context); // 处理生命周期 RegisterLifecycleComponent(contextUtility); }); Container.RegisterPlurality(utility); _logger.Info($"Utility registered: {typeof(TUtility).Name}"); return utility; } /// /// 注册工具类型,由 DI 容器自动创建实例 /// /// 工具类型 /// 可选的实例创建后回调,用于自定义配置 public void RegisterUtility(Action? onCreated = null) where T : class, IUtility { _logger.Debug($"Registering utility type: {typeof(T).Name}"); Container.RegisterFactory(sp => { var utility = ActivatorUtilities.CreateInstance(sp); // 如果是 IContextUtility,设置上下文 if (utility is IContextUtility contextUtility) { contextUtility.SetContext(Context); RegisterLifecycleComponent(contextUtility); } // 用户自定义钩子 onCreated?.Invoke(utility); _logger.Debug($"Utility created: {typeof(T).Name}"); return utility; }); _logger.Info($"Utility type registered: {typeof(T).Name}"); } #endregion #region Initialization /// /// 同步初始化方法,阻塞当前线程直到初始化完成 /// public void Initialize() { try { InitializeInternalAsync(false).GetAwaiter().GetResult(); } catch (Exception e) { _logger.Error("Architecture initialization failed:", e); EnterPhase(ArchitecturePhase.FailedInitialization); throw; } } /// /// 异步初始化方法,返回Task以便调用者可以等待初始化完成 /// /// 表示异步初始化操作的Task public async Task InitializeAsync() { try { await InitializeInternalAsync(true); } catch (Exception e) { _logger.Error("Architecture initialization failed:", e); EnterPhase(ArchitecturePhase.FailedInitialization); throw; } } /// /// 异步初始化架构内部组件,包括上下文、模型和系统的初始化 /// /// 是否启用异步模式进行组件初始化 /// 异步任务,表示初始化操作的完成 private async Task InitializeInternalAsync(bool asyncMode) { // === 基础上下文 & Logger === LoggerFactoryResolver.Provider = Configuration.LoggerProperties.LoggerFactoryProvider; _logger = LoggerFactoryResolver.Provider.CreateLogger(GetType().Name); Environment.Initialize(); // 注册内置服务模块 Services.ModuleManager.RegisterBuiltInModules(Container); // 将 Environment 注册到容器(如果尚未注册) if (!Container.Contains()) Container.RegisterPlurality(Environment); // 初始化架构上下文(如果尚未初始化) _context ??= new ArchitectureContext(Container); GameContext.Bind(GetType(), _context); // 为服务设置上下文 Services.SetContext(_context); if (Configurator is null) { _logger.Debug("Mediator-based cqrs will not take effect without the service setter configured!"); } // 执行服务钩子 Container.ExecuteServicesHook(Configurator); // 初始化服务模块 await Services.ModuleManager.InitializeAllAsync(asyncMode); // === 用户 OnInitialize === _logger.Debug("Calling user OnInitialize()"); OnInitialize(); _logger.Debug("User OnInitialize() completed"); // === 组件初始化阶段 === await InitializeAllComponentsAsync(asyncMode); // === 初始化完成阶段 === Container.Freeze(); _logger.Info("IOC container frozen"); _mInitialized = true; EnterPhase(ArchitecturePhase.Ready); // 🔥 释放 Ready await _readyTcs.TrySetResult(); _logger.Info($"Architecture {GetType().Name} is ready - all components initialized"); } /// /// 等待架构初始化完成(Ready 阶段) /// 如果架构已经处于就绪状态,则立即返回已完成的任务; /// 否则返回一个任务,该任务将在架构进入就绪状态时完成。 /// /// 表示等待操作的Task对象 public Task WaitUntilReadyAsync() { return IsReady ? Task.CompletedTask : _readyTcs.Task; } /// /// 获取用于配置服务集合的委托 /// 默认实现返回null,子类可以重写此属性以提供自定义配置逻辑 /// /// /// 一个可为空的Action委托,用于配置IServiceCollection实例 /// public virtual Action? Configurator => null; #endregion }