using GFramework.Core.Abstractions.Architectures; using GFramework.Core.Abstractions.Enums; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Abstractions.Model; using GFramework.Core.Abstractions.Systems; using GFramework.Core.Abstractions.Utility; using GFramework.Core.Extensions; using Microsoft.Extensions.DependencyInjection; namespace GFramework.Core.Architectures; /// /// 架构组件注册管理器 /// 负责管理 System、Model、Utility 的注册 /// internal sealed class ArchitectureComponentRegistry( IArchitecture architecture, IArchitectureConfiguration configuration, IArchitectureServices services, ArchitectureLifecycle lifecycle, ILogger logger) { #region Validation /// /// 验证是否允许注册组件 /// /// 组件类型描述 /// 当不允许注册时抛出 private void ValidateRegistration(string componentType) { if (lifecycle.CurrentPhase < ArchitecturePhase.Ready || configuration.ArchitectureProperties.AllowLateRegistration) return; var errorMsg = $"Cannot register {componentType} after Architecture is Ready"; logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } #endregion #region System Registration /// /// 注册一个系统到架构中 /// /// 要注册的系统类型 /// 要注册的系统实例 /// 注册成功的系统实例 public TSystem RegisterSystem(TSystem system) where TSystem : ISystem { ValidateRegistration("system"); logger.Debug($"Registering system: {typeof(TSystem).Name}"); system.SetContext(architecture.Context); services.Container.RegisterPlurality(system); // 处理生命周期 lifecycle.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}"); services.Container.RegisterFactory(sp => { // 1. DI 创建实例 var system = ActivatorUtilities.CreateInstance(sp); // 2. 框架默认处理 system.SetContext(architecture.Context); lifecycle.RegisterLifecycleComponent(system); // 3. 用户自定义处理(钩子) onCreated?.Invoke(system); logger.Debug($"System created: {typeof(T).Name}"); return system; }); logger.Info($"System type registered: {typeof(T).Name}"); } #endregion #region Model Registration /// /// 注册一个模型到架构中 /// /// 要注册的模型类型 /// 要注册的模型实例 /// 注册成功的模型实例 public TModel RegisterModel(TModel model) where TModel : IModel { ValidateRegistration("model"); logger.Debug($"Registering model: {typeof(TModel).Name}"); model.SetContext(architecture.Context); services.Container.RegisterPlurality(model); // 处理生命周期 lifecycle.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}"); services.Container.RegisterFactory(sp => { var model = ActivatorUtilities.CreateInstance(sp); model.SetContext(architecture.Context); lifecycle.RegisterLifecycleComponent(model); // 用户自定义钩子 onCreated?.Invoke(model); logger.Debug($"Model created: {typeof(T).Name}"); return model; }); logger.Info($"Model type registered: {typeof(T).Name}"); } #endregion #region Utility Registration /// /// 注册一个工具到架构中 /// /// 要注册的工具类型 /// 要注册的工具实例 /// 注册成功的工具实例 public TUtility RegisterUtility(TUtility utility) where TUtility : IUtility { logger.Debug($"Registering utility: {typeof(TUtility).Name}"); // 处理上下文工具类型的设置和生命周期管理 utility.IfType(contextUtility => { contextUtility.SetContext(architecture.Context); // 处理生命周期 lifecycle.RegisterLifecycleComponent(contextUtility); }); services.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}"); services.Container.RegisterFactory(sp => { var utility = ActivatorUtilities.CreateInstance(sp); // 如果是 IContextUtility,设置上下文 if (utility is IContextUtility contextUtility) { contextUtility.SetContext(architecture.Context); lifecycle.RegisterLifecycleComponent(contextUtility); } // 用户自定义钩子 onCreated?.Invoke(utility); logger.Debug($"Utility created: {typeof(T).Name}"); return utility; }); logger.Info($"Utility type registered: {typeof(T).Name}"); } #endregion }