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}");
RegisterLifecycleHook(module);
Container.RegisterPlurality(module);
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 = [];
///
/// 可销毁组件的去重集合
///
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 IArchitectureLifecycle RegisterLifecycleHook(IArchitectureLifecycle 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");
}
}
// 处理销毁
if (component is not IDestroyable disposable) return;
// 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
if (_disposableSet.Add(disposable))
{
_disposables.Add(disposable);
_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.Init();
}
///
/// 抽象初始化方法,由子类重写以进行自定义初始化操作
///
protected abstract void Init();
///
/// 销毁架构并清理所有组件资源
///
public virtual void Destroy()
{
// 检查当前阶段,如果已经处于销毁或已销毁状态则直接返回
if (CurrentPhase >= ArchitecturePhase.Destroying)
{
_logger.Warn("Architecture destroy called but already in destroying/destroyed state");
return;
}
// 进入销毁阶段
_logger.Info("Starting architecture destruction");
EnterPhase(ArchitecturePhase.Destroying);
// 销毁所有实现了 IDestroyable 的组件(按注册逆序销毁)
_logger.Info($"Destroying {_disposables.Count} disposable components");
for (var i = _disposables.Count - 1; i >= 0; i--)
{
var disposable = _disposables[i];
try
{
_logger.Debug($"Destroying component: {disposable.GetType().Name}");
disposable.Destroy();
}
catch (Exception ex)
{
_logger.Error($"Error destroying {disposable.GetType().Name}", ex);
// 继续销毁其他组件,不会因为一个组件失败而中断
}
}
_disposables.Clear();
_disposableSet.Clear();
// 进入已销毁阶段
EnterPhase(ArchitecturePhase.Destroyed);
_logger.Info("Architecture destruction completed");
}
#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();
// 将 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);
// === 用户 Init ===
_logger.Debug("Calling user Init()");
Init();
_logger.Debug("User Init() 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
}