From 3e672cf56f54553ed2c838ac8b28004a42eb8f18 Mon Sep 17 00:00:00 2001 From: GwWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Wed, 24 Dec 2025 23:09:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor(architecture):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E5=9F=BA=E7=B1=BB=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E6=B3=A8=E5=85=A5=E5=92=8C=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将Architecture类重构为使用构造函数注入IArchitectureConfiguration、IArchitectureServices和IArchitectureContext - 移除泛型参数和单例模式,改为使用依赖注入容器管理实例 - 添加异步初始化方法InitializeAsync支持异步初始化场景 - 引入ArchitectureOptions类统一管理架构配置选项 - 创建DefaultArchitectureConfiguration和DefaultArchitectureServices默认实现 - 新增IArchitectureContext接口提供统一的上下文访问 - 添加IAsyncInitializable接口支持异步初始化能力 - 简化架构生命周期阶段,移除Created、BeforeInit和AfterInit阶段 - 更新事件系统为ITypeEventSystem接口实现 - 重构命令和控制器接口,统一使用IContextAware替代多个能力接口 - 移除FunctionalArchitectureOptions和相关委托配置方式 - 优化日志记录使用配置中的LoggerFactory实例 --- GFramework.Core/architecture/Architecture.cs | 340 ++++++------ .../architecture/ArchitectureConstants.cs | 5 +- .../architecture/ArchitectureOptions.cs | 20 + .../ArchitectureOptionsDelegates.cs | 17 - .../architecture/ArchitecturePhase.cs | 15 - .../DefaultArchitectureConfiguration.cs | 28 + .../DefaultArchitectureContext.cs | 88 ++++ .../DefaultArchitectureServices.cs | 11 + .../FunctionalArchitectureOptions.cs | 26 - GFramework.Core/architecture/IArchitecture.cs | 38 +- .../IArchitectureConfiguration.cs | 19 + .../architecture/IArchitectureContext.cs | 84 +++ .../architecture/IArchitectureOptions.cs | 17 - .../architecture/IArchitectureServices.cs | 22 + .../architecture/IAsyncInitializable.cs | 13 + GFramework.Core/command/AbstractCommand.cs | 47 +- GFramework.Core/command/ICanSendCommand.cs | 9 - GFramework.Core/command/ICommand.cs | 12 +- GFramework.Core/controller/IController.cs | 10 +- GFramework.Core/events/ICanRegisterEvent.cs | 10 - GFramework.Core/events/ICanSendEvent.cs | 9 - GFramework.Core/events/ITypeEventSystem.cs | 35 ++ GFramework.Core/events/TypeEventSystem.cs | 68 +-- .../extensions/CanGetExtensions.cs | 56 -- .../extensions/CanRegisterEventExtensions.cs | 32 -- .../extensions/CanSendExtensions.cs | 89 ---- GFramework.Core/ioc/IIocContainer.cs | 117 +++++ GFramework.Core/ioc/IocContainer.cs | 45 +- GFramework.Core/logging/ConsoleLogger.cs | 493 +++++++++++++----- .../logging/ConsoleLoggerFactory.cs | 17 + GFramework.Core/logging/ILog.cs | 72 --- GFramework.Core/logging/ILogger.cs | 330 ++++++++++++ GFramework.Core/logging/ILoggerFactory.cs | 17 +- GFramework.Core/logging/Log.cs | 149 ------ GFramework.Core/logging/LogConfig.cs | 102 ---- GFramework.Core/logging/LoggerFactory.cs | 184 ------- GFramework.Core/logging/NoopLogger.cs | 371 +++++++++++++ GFramework.Core/logging/NoopLoggerFactory.cs | 17 + GFramework.Core/logging/NullLogger.cs | 67 --- GFramework.Core/model/ICanGetModel.cs | 9 - GFramework.Core/model/IModel.cs | 2 +- GFramework.Core/query/ICanSendQuery.cs | 9 - GFramework.Core/query/IQuery.cs | 3 +- GFramework.Core/rule/ContextAwareBase.cs | 29 ++ GFramework.Core/rule/IBelongToArchitecture.cs | 16 - GFramework.Core/rule/ICanSetArchitecture.cs | 15 - GFramework.Core/rule/IContextAware.cs | 15 + GFramework.Core/system/AbstractSystem.cs | 47 +- GFramework.Core/system/ICanGetSystem.cs | 9 - GFramework.Core/system/ISystem.cs | 6 +- GFramework.Core/utility/ICanGetUtility.cs | 9 - GFramework.Game/GFramework.Game.csproj | 1 + GFramework.Godot/logging/GodotLogProvider.cs | 17 + GFramework.Godot/logging/GodotLogger.cs | 5 +- 54 files changed, 1878 insertions(+), 1415 deletions(-) create mode 100644 GFramework.Core/architecture/ArchitectureOptions.cs delete mode 100644 GFramework.Core/architecture/ArchitectureOptionsDelegates.cs create mode 100644 GFramework.Core/architecture/DefaultArchitectureConfiguration.cs create mode 100644 GFramework.Core/architecture/DefaultArchitectureContext.cs create mode 100644 GFramework.Core/architecture/DefaultArchitectureServices.cs delete mode 100644 GFramework.Core/architecture/FunctionalArchitectureOptions.cs create mode 100644 GFramework.Core/architecture/IArchitectureConfiguration.cs create mode 100644 GFramework.Core/architecture/IArchitectureContext.cs delete mode 100644 GFramework.Core/architecture/IArchitectureOptions.cs create mode 100644 GFramework.Core/architecture/IArchitectureServices.cs create mode 100644 GFramework.Core/architecture/IAsyncInitializable.cs delete mode 100644 GFramework.Core/command/ICanSendCommand.cs delete mode 100644 GFramework.Core/events/ICanRegisterEvent.cs delete mode 100644 GFramework.Core/events/ICanSendEvent.cs create mode 100644 GFramework.Core/events/ITypeEventSystem.cs delete mode 100644 GFramework.Core/extensions/CanGetExtensions.cs delete mode 100644 GFramework.Core/extensions/CanRegisterEventExtensions.cs delete mode 100644 GFramework.Core/extensions/CanSendExtensions.cs create mode 100644 GFramework.Core/ioc/IIocContainer.cs create mode 100644 GFramework.Core/logging/ConsoleLoggerFactory.cs delete mode 100644 GFramework.Core/logging/ILog.cs create mode 100644 GFramework.Core/logging/ILogger.cs delete mode 100644 GFramework.Core/logging/Log.cs delete mode 100644 GFramework.Core/logging/LogConfig.cs delete mode 100644 GFramework.Core/logging/LoggerFactory.cs create mode 100644 GFramework.Core/logging/NoopLogger.cs create mode 100644 GFramework.Core/logging/NoopLoggerFactory.cs delete mode 100644 GFramework.Core/logging/NullLogger.cs delete mode 100644 GFramework.Core/model/ICanGetModel.cs delete mode 100644 GFramework.Core/query/ICanSendQuery.cs create mode 100644 GFramework.Core/rule/ContextAwareBase.cs delete mode 100644 GFramework.Core/rule/IBelongToArchitecture.cs delete mode 100644 GFramework.Core/rule/ICanSetArchitecture.cs create mode 100644 GFramework.Core/rule/IContextAware.cs delete mode 100644 GFramework.Core/system/ICanGetSystem.cs delete mode 100644 GFramework.Core/utility/ICanGetUtility.cs create mode 100644 GFramework.Godot/logging/GodotLogProvider.cs diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 4f8c9ca..3974033 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -13,29 +13,47 @@ namespace GFramework.Core.architecture; /// 架构基类,提供系统、模型、工具等组件的注册与管理功能。 /// 使用单例模式确保全局唯一实例,并支持命令、查询和事件机制。 /// -/// 派生类类型,用于实现单例 -public abstract class Architecture : IArchitecture - where T : Architecture, new() +public abstract class Architecture( + IArchitectureConfiguration? configuration = null, + IArchitectureServices? services = null, + IArchitectureContext? context = null + ) + : IArchitecture { /// - /// 获取架构选项的虚拟属性 + /// 获取架构配置对象 /// - /// 返回IArchitectureOptions接口实例,包含架构配置选项 - /// - /// 默认实现返回FunctionalArchitectureOptions实例,其中包含两个委托: - /// 第一个委托始终返回true,第二个委托始终返回false - /// - protected virtual IArchitectureOptions Options { get; } = new FunctionalArchitectureOptions( - () => true, - () => false - ); - - #region Fields and Properties + /// + /// 返回一个IArchitectureConfiguration接口的实例,默认为DefaultArchitectureConfiguration类型 + /// + private IArchitectureConfiguration Configuration { get; } = configuration ?? new DefaultArchitectureConfiguration(); /// - /// 控制反转容器,用于存储和获取各种服务(如系统、模型、工具) + /// 获取架构服务对象 /// - private readonly IocContainer _mContainer = new(); + /// + /// 返回一个IArchitectureServices接口的实例,默认为DefaultArchitectureServices类型 + /// + private IArchitectureServices Services { get; } = services ?? new DefaultArchitectureServices(); + + /// + /// 获取依赖注入容器 + /// + /// + /// 通过Services属性获取的IArchitectureServices中的Container属性 + /// + private IIocContainer Container => Services.Container; + + /// + /// 获取类型事件系统 + /// + /// + /// 通过Services属性获取的IArchitectureServices中的TypeEventSystem属性 + /// + private ITypeEventSystem TypeEventSystem => Services.TypeEventSystem; + + + #region Fields and Properties /// /// 存储尚未初始化的模型集合,在初始化阶段统一调用Init方法 @@ -52,22 +70,11 @@ public abstract class Architecture : IArchitecture /// private readonly HashSet _allSystems = []; - /// - /// 类型化事件系统,负责事件的发布与订阅管理 - /// - private readonly TypeEventSystem _mTypeEventSystem = new(); - /// /// 标记架构是否已初始化完成 /// private bool _mInited; - /// - /// 获取架构实例的静态属性 - /// - /// 返回IArchitecture类型的架构实例 - public static IArchitecture Instance => MArchitectureLazy.Value; - /// /// 生命周期感知对象列表 /// @@ -79,76 +86,13 @@ public abstract class Architecture : IArchitecture private ArchitecturePhase CurrentPhase { get; set; } /// - /// 静态只读字段,用于延迟初始化架构实例 - /// 使用Lazy确保线程安全的单例模式实现 + /// 日志记录器实例,用于记录应用程序的运行日志 /// - /// - /// 初始化过程包括: - /// 1. 创建T类型的实例 - /// 2. 调用用户自定义的Init方法 - /// 3. 执行注册的补丁逻辑 - /// 4. 初始化所有已注册的模型和系统 - /// 5. 清理临时集合并标记初始化完成 - /// - /// T类型的架构实例 - private static readonly Lazy MArchitectureLazy = new(() => - { - var arch = new T(); - var logger = Log.CreateLogger("Architecture"); - - // == Architecture Init == - arch.EnterPhase(ArchitecturePhase.Created); - logger.Info($"Architecture {typeof(T).Name} created"); - - arch.EnterPhase(ArchitecturePhase.BeforeInit); - logger.Info("Starting architecture initialization"); - - // 调用用户实现的初始化 - arch.Init(); - arch.EnterPhase(ArchitecturePhase.AfterInit); - logger.Info("Architecture initialization completed"); + private ILogger _logger = null!; - - // == Model Init == - arch.EnterPhase(ArchitecturePhase.BeforeModelInit); - logger.Info($"Initializing {arch._mModels.Count} models"); - - // 初始化所有已注册但尚未初始化的模型 - foreach (var model in arch._mModels) - { - logger.Debug($"Initializing model: {model.GetType().Name}"); - model.Init(); - } - arch._mModels.Clear(); - arch.EnterPhase(ArchitecturePhase.AfterModelInit); - logger.Info("All models initialized"); - - - // == System Init == - arch.EnterPhase(ArchitecturePhase.BeforeSystemInit); - logger.Info($"Initializing {arch._mSystems.Count} systems"); - - // 初始化所有已注册但尚未初始化的系统 - foreach (var system in arch._mSystems) - { - logger.Debug($"Initializing system: {system.GetType().Name}"); - system.Init(); - } - arch._mSystems.Clear(); - arch.EnterPhase(ArchitecturePhase.AfterSystemInit); - logger.Info("All systems initialized"); - - - // == Finalize == - // 冻结IOC容器,不允许 anymore - arch._mContainer.Freeze(); - arch._mInited = true; - arch.EnterPhase(ArchitecturePhase.Ready); - // 发送架构生命周期就绪事件 - arch.SendEvent(new ArchitectureEvents.ArchitectureLifecycleReadyEvent()); - logger.Info($"Architecture {typeof(T).Name} is ready - all components initialized"); - return arch; - }, LazyThreadSafetyMode.ExecutionAndPublication); + private IArchitectureContext? _context = context; + + public IArchitectureContext Context => _context!; #endregion @@ -161,9 +105,8 @@ public abstract class Architecture : IArchitecture /// 当阶段转换不被允许时抛出异常 private void EnterPhase(ArchitecturePhase next) { - var logger = Log.CreateLogger("Architecture"); - - if (Options.StrictPhaseValidation && + var logger = Configuration.LoggerFactory.GetLogger(nameof(Architecture)); + if (Configuration.Options.StrictPhaseValidation && (!ArchitectureConstants.PhaseTransitions.TryGetValue(CurrentPhase, out var allowed) || !allowed.Contains(next))) { @@ -175,16 +118,16 @@ public abstract class Architecture : IArchitecture var previousPhase = CurrentPhase; CurrentPhase = next; - + if (previousPhase != next) { logger.Info($"Architecture phase changed: {previousPhase} -> {next}"); } - + NotifyPhase(next); // 通知所有架构阶段感知对象阶段变更 - foreach (var obj in _mContainer.GetAll()) + foreach (var obj in Container.GetAll()) { logger.Debug($"Notifying phase-aware object {obj.GetType().Name} of phase change to {next}"); obj.OnArchitecturePhase(next); @@ -207,7 +150,7 @@ public abstract class Architecture : IArchitecture /// 生命周期钩子实例 public void RegisterLifecycleHook(IArchitectureLifecycle hook) { - if (CurrentPhase >= ArchitecturePhase.Ready && !Options.AllowLateRegistration) + if (CurrentPhase >= ArchitecturePhase.Ready && !Configuration.Options.AllowLateRegistration) throw new InvalidOperationException( "Cannot register lifecycle hook after architecture is Ready"); _lifecycleHooks.Add(hook); @@ -228,8 +171,8 @@ public abstract class Architecture : IArchitecture /// public virtual void Destroy() { - var logger = Log.CreateLogger("Architecture"); - + var logger = Configuration.LoggerFactory.GetLogger(nameof(Architecture)); + // 检查当前阶段,如果已经处于销毁或已销毁状态则直接返回 if (CurrentPhase >= ArchitecturePhase.Destroying) { @@ -268,10 +211,10 @@ public abstract class Architecture : IArchitecture /// 要安装的模块 public void InstallModule(IArchitectureModule module) { - var logger = Log.CreateLogger("Architecture"); + var logger = Configuration.LoggerFactory.GetLogger(nameof(Architecture)); logger.Debug($"Installing module: {module.GetType().Name}"); RegisterLifecycleHook(module); - _mContainer.RegisterPlurality(module); + Container.RegisterPlurality(module); module.Install(this); logger.Info($"Module installed: {module.GetType().Name}"); } @@ -280,6 +223,106 @@ public abstract class Architecture : IArchitecture #region Component Registration + public void Initialize() + { + _logger = Configuration.LoggerFactory.GetLogger(GetType().Name); + _context ??= new DefaultArchitectureContext(Container, TypeEventSystem, _logger); + // 调用用户实现的初始化 + Init(); + + // == Model Init == + EnterPhase(ArchitecturePhase.BeforeModelInit); + _logger.Info($"Initializing {_mModels.Count} models"); + + // 初始化所有已注册但尚未初始化的模型 + foreach (var model in _mModels) + { + _logger.Debug($"Initializing model: {model.GetType().Name}"); + model.Init(); + } + + _mModels.Clear(); + EnterPhase(ArchitecturePhase.AfterModelInit); + _logger.Info("All models initialized"); + + + // == System Init == + EnterPhase(ArchitecturePhase.BeforeSystemInit); + _logger.Info($"Initializing {_mSystems.Count} systems"); + + // 初始化所有已注册但尚未初始化的系统 + foreach (var system in _mSystems) + { + _logger.Debug($"Initializing system: {system.GetType().Name}"); + system.Init(); + } + + _mSystems.Clear(); + EnterPhase(ArchitecturePhase.AfterSystemInit); + _logger.Info("All systems initialized"); + + + // == Finalize == + // 冻结IOC容器,不允许 anymore + Container.Freeze(); + _mInited = true; + EnterPhase(ArchitecturePhase.Ready); + // 发送架构生命周期就绪事件 + SendEvent(new ArchitectureEvents.ArchitectureLifecycleReadyEvent()); + _logger.Info($"Architecture {GetType().Name} is ready - all components initialized"); + } + + public async Task InitializeAsync() + { + _logger = Configuration.LoggerFactory.GetLogger(GetType().Name); + + // 调用用户实现的初始化 + Init(); + + // == Model Init == + EnterPhase(ArchitecturePhase.BeforeModelInit); + _logger.Info($"Initializing {_mModels.Count} models"); + + // 异步初始化所有已注册但尚未初始化的模型 + foreach (var model in _mModels) + { + _logger.Debug($"Initializing model: {model.GetType().Name}"); + if (model is IAsyncInitializable asyncModel) + await asyncModel.InitializeAsync(); + else + model.Init(); + } + + _mModels.Clear(); + EnterPhase(ArchitecturePhase.AfterModelInit); + _logger.Info("All models initialized"); + + // == System Init == + EnterPhase(ArchitecturePhase.BeforeSystemInit); + _logger.Info($"Initializing {_mSystems.Count} systems"); + + // 异步初始化所有已注册但尚未初始化的系统 + foreach (var system in _mSystems) + { + _logger.Debug($"Initializing system: {system.GetType().Name}"); + if (system is IAsyncInitializable asyncSystem) + await asyncSystem.InitializeAsync(); + else + system.Init(); + } + + _mSystems.Clear(); + EnterPhase(ArchitecturePhase.AfterSystemInit); + _logger.Info("All systems initialized"); + + // == Finalize == + Container.Freeze(); + _mInited = true; + EnterPhase(ArchitecturePhase.Ready); + SendEvent(new ArchitectureEvents.ArchitectureLifecycleReadyEvent()); + _logger.Info($"Architecture {GetType().Name} is ready - all components initialized"); + } + /// /// 注册一个系统到架构中。 /// 若当前未初始化,则暂存至待初始化列表;否则立即初始化该系统。 @@ -288,28 +331,26 @@ public abstract class Architecture : IArchitecture /// 要注册的系统实例 public void RegisterSystem(TSystem system) where TSystem : ISystem { - var logger = Log.CreateLogger("Architecture"); - - if (CurrentPhase >= ArchitecturePhase.Ready && !Options.AllowLateRegistration) + if (CurrentPhase >= ArchitecturePhase.Ready && !Configuration.Options.AllowLateRegistration) { var errorMsg = "Cannot register system after Architecture is Ready"; - logger.Error(errorMsg); + _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } - - logger.Debug($"Registering system: {typeof(TSystem).Name}"); + + _logger.Debug($"Registering system: {typeof(TSystem).Name}"); system.SetArchitecture(this); - _mContainer.RegisterPlurality(system); + Container.RegisterPlurality(system); _allSystems.Add(system); if (!_mInited) _mSystems.Add(system); else { - logger.Debug($"Immediately initializing system: {typeof(TSystem).Name}"); + _logger.Debug($"Immediately initializing system: {typeof(TSystem).Name}"); system.Init(); } - - logger.Info($"System registered: {typeof(TSystem).Name}"); + + _logger.Info($"System registered: {typeof(TSystem).Name}"); } /// @@ -320,28 +361,26 @@ public abstract class Architecture : IArchitecture /// 要注册的模型实例 public void RegisterModel(TModel model) where TModel : IModel { - var logger = Log.CreateLogger("Architecture"); - - if (CurrentPhase >= ArchitecturePhase.Ready && !Options.AllowLateRegistration) + if (CurrentPhase >= ArchitecturePhase.Ready && !Configuration.Options.AllowLateRegistration) { var errorMsg = "Cannot register model after Architecture is Ready"; - logger.Error(errorMsg); + _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } - - logger.Debug($"Registering model: {typeof(TModel).Name}"); + + _logger.Debug($"Registering model: {typeof(TModel).Name}"); model.SetArchitecture(this); - _mContainer.RegisterPlurality(model); + Container.RegisterPlurality(model); if (!_mInited) _mModels.Add(model); else { - logger.Debug($"Immediately initializing model: {typeof(TModel).Name}"); + _logger.Debug($"Immediately initializing model: {typeof(TModel).Name}"); model.Init(); } - - logger.Info($"Model registered: {typeof(TModel).Name}"); + + _logger.Info($"Model registered: {typeof(TModel).Name}"); } /// @@ -352,47 +391,14 @@ public abstract class Architecture : IArchitecture /// 要注册的工具实例 public void RegisterUtility(TUtility utility) where TUtility : IUtility { - var logger = Log.CreateLogger("Architecture"); - logger.Debug($"Registering utility: {typeof(TUtility).Name}"); - _mContainer.RegisterPlurality(utility); - logger.Info($"Utility registered: {typeof(TUtility).Name}"); + _logger.Debug($"Registering utility: {typeof(TUtility).Name}"); + Container.RegisterPlurality(utility); + _logger.Info($"Utility registered: {typeof(TUtility).Name}"); } #endregion - #region Component Retrieval - /// - /// 从IOC容器中获取指定类型的系统实例 - /// - /// 目标系统类型 - /// 对应的系统实例 - public TSystem? GetSystem() where TSystem : class, ISystem - { - return _mContainer.Get(); - } - - /// - /// 从IOC容器中获取指定类型的模型实例 - /// - /// 目标模型类型 - /// 对应的模型实例 - public TModel? GetModel() where TModel : class, IModel - { - return _mContainer.Get(); - } - - /// - /// 从IOC容器中获取指定类型的工具实例 - /// - /// 目标工具类型 - /// 对应的工具实例 - public TUtility? GetUtility() where TUtility : class, IUtility - { - return _mContainer.Get(); - } - - #endregion #region Command Execution @@ -476,7 +482,7 @@ public abstract class Architecture : IArchitecture /// 事件类型 public void SendEvent() where TEvent : new() { - _mTypeEventSystem.Send(); + TypeEventSystem.Send(); } /// @@ -486,7 +492,7 @@ public abstract class Architecture : IArchitecture /// 要发布的事件实例 public void SendEvent(TEvent e) { - _mTypeEventSystem.Send(e); + TypeEventSystem.Send(e); } /// @@ -497,7 +503,7 @@ public abstract class Architecture : IArchitecture /// 可用于取消订阅的对象 public IUnRegister RegisterEvent(Action onEvent) { - return _mTypeEventSystem.Register(onEvent); + return TypeEventSystem.Register(onEvent); } /// @@ -507,7 +513,7 @@ public abstract class Architecture : IArchitecture /// 之前绑定的事件处理器 public void UnRegisterEvent(Action onEvent) { - _mTypeEventSystem.UnRegister(onEvent); + TypeEventSystem.UnRegister(onEvent); } #endregion diff --git a/GFramework.Core/architecture/ArchitectureConstants.cs b/GFramework.Core/architecture/ArchitectureConstants.cs index b7eec51..784b15d 100644 --- a/GFramework.Core/architecture/ArchitectureConstants.cs +++ b/GFramework.Core/architecture/ArchitectureConstants.cs @@ -8,10 +8,7 @@ public static class ArchitectureConstants public static readonly ImmutableDictionary PhaseTransitions = new Dictionary { - { ArchitecturePhase.None, [ArchitecturePhase.Created] }, - { ArchitecturePhase.Created, [ArchitecturePhase.BeforeInit] }, - { ArchitecturePhase.BeforeInit, [ArchitecturePhase.AfterInit] }, - { ArchitecturePhase.AfterInit, [ArchitecturePhase.BeforeModelInit] }, + { ArchitecturePhase.None, [ArchitecturePhase.BeforeModelInit] }, { ArchitecturePhase.BeforeModelInit, [ArchitecturePhase.AfterModelInit] }, { ArchitecturePhase.AfterModelInit, [ArchitecturePhase.BeforeSystemInit] }, { ArchitecturePhase.BeforeSystemInit, [ArchitecturePhase.AfterSystemInit] }, diff --git a/GFramework.Core/architecture/ArchitectureOptions.cs b/GFramework.Core/architecture/ArchitectureOptions.cs new file mode 100644 index 0000000..9baaa1c --- /dev/null +++ b/GFramework.Core/architecture/ArchitectureOptions.cs @@ -0,0 +1,20 @@ +namespace GFramework.Core.architecture; + +/// +/// 架构选项配置类,用于定义架构行为的相关配置选项 +/// +public sealed class ArchitectureOptions( + bool strictPhaseValidation = true, + bool allowLateRegistration = false +) +{ + /// + /// 严格阶段验证开关,当设置为true时启用严格的阶段验证机制 + /// + public bool StrictPhaseValidation = strictPhaseValidation; + + /// + /// 允许延迟注册开关,当设置为true时允许在初始化完成后进行组件注册 + /// + public bool AllowLateRegistration = allowLateRegistration; +} \ No newline at end of file diff --git a/GFramework.Core/architecture/ArchitectureOptionsDelegates.cs b/GFramework.Core/architecture/ArchitectureOptionsDelegates.cs deleted file mode 100644 index b115f5b..0000000 --- a/GFramework.Core/architecture/ArchitectureOptionsDelegates.cs +++ /dev/null @@ -1,17 +0,0 @@ - -namespace GFramework.Core.architecture; - -public class ArchitectureOptionsDelegates -{ - /// - /// 架构可配置选项委托 - /// - /// 是否严格验证阶段转换 - public delegate bool StrictPhaseValidationDelegate(); - - /// - /// 架构可配置选项委托 - /// - /// 是否允许在 Ready 阶段后注册系统/模型 - public delegate bool AllowLateRegistrationDelegate(); -} \ No newline at end of file diff --git a/GFramework.Core/architecture/ArchitecturePhase.cs b/GFramework.Core/architecture/ArchitecturePhase.cs index 0396ce2..052ea91 100644 --- a/GFramework.Core/architecture/ArchitecturePhase.cs +++ b/GFramework.Core/architecture/ArchitecturePhase.cs @@ -13,21 +13,6 @@ public enum ArchitecturePhase /// 无效阶段,表示未定义的阶段 /// None = 0, - /// - /// 对象创建阶段,对应 new T() 操作完成后的状态 - /// - Created, - - /// - /// 初始化之前阶段,在 Init() 方法调用之前的状态 - /// - BeforeInit, - - /// - /// 初始化之后阶段,在 Init() 方法调用之后的状态 - /// - AfterInit, - /// /// 模型初始化之前阶段 /// diff --git a/GFramework.Core/architecture/DefaultArchitectureConfiguration.cs b/GFramework.Core/architecture/DefaultArchitectureConfiguration.cs new file mode 100644 index 0000000..837e1e9 --- /dev/null +++ b/GFramework.Core/architecture/DefaultArchitectureConfiguration.cs @@ -0,0 +1,28 @@ +using GFramework.Core.logging; + +namespace GFramework.Core.architecture; + +/// +/// 默认架构配置类,实现IArchitectureConfiguration接口 +/// 提供日志工厂、日志级别和架构选项的默认配置 +/// +public class DefaultArchitectureConfiguration: IArchitectureConfiguration +{ + /// + /// 获取或设置日志工厂实例 + /// 默认使用控制台日志工厂 + /// + public ILoggerFactory LoggerFactory { get; set; } = new ConsoleLoggerFactory(); + + /// + /// 获取或设置日志级别 + /// 默认设置为Info级别 + /// + public LogLevel LogLevel { get; set; } = LogLevel.Info; + + /// + /// 获取或设置架构选项 + /// 默认创建新的ArchitectureOptions实例 + /// + public ArchitectureOptions Options { get; set; } = new(); +} diff --git a/GFramework.Core/architecture/DefaultArchitectureContext.cs b/GFramework.Core/architecture/DefaultArchitectureContext.cs new file mode 100644 index 0000000..370384e --- /dev/null +++ b/GFramework.Core/architecture/DefaultArchitectureContext.cs @@ -0,0 +1,88 @@ + +using System.ComponentModel; +using GFramework.Core.command; +using GFramework.Core.events; +using GFramework.Core.ioc; +using GFramework.Core.logging; +using GFramework.Core.model; +using GFramework.Core.query; +using GFramework.Core.system; +using GFramework.Core.utility; + +namespace GFramework.Core.architecture; + +public class DefaultArchitectureContext( + IIocContainer container, + ITypeEventSystem typeEventSystem, + ILogger logger) + : IArchitectureContext +{ + private readonly ITypeEventSystem _typeEventSystem = typeEventSystem; + public ILogger Logger { get; } = logger; + + #region Component Retrieval + + /// + /// 从IOC容器中获取指定类型的系统实例 + /// + /// 目标系统类型 + /// 对应的系统实例 + public TSystem? GetSystem() where TSystem : class, ISystem + { + return container.Get(); + } + + /// + /// 从IOC容器中获取指定类型的模型实例 + /// + /// 目标模型类型 + /// 对应的模型实例 + public TModel? GetModel() where TModel : class, IModel + { + return container.Get(); + } + + /// + /// 从IOC容器中获取指定类型的工具实例 + /// + /// 目标工具类型 + /// 对应的工具实例 + public TUtility? GetUtility() where TUtility : class, IUtility + { + return container.Get(); + } + + #endregion + + public void SendCommand(ICommand command) + { + throw new NotImplementedException(); + } + + public TResult SendCommand(ICommand command) + { + throw new NotImplementedException(); + } + + public TResult SendQuery(IQuery query) + { + throw new NotImplementedException(); + } + + public void SendEvent() + { + throw new NotImplementedException(); + } + + public void SendEvent(TEvent e) + { + throw new NotImplementedException(); + } + + public IUnRegister RegisterEvent(Action handler) + { + throw new NotImplementedException(); + } + + +} \ No newline at end of file diff --git a/GFramework.Core/architecture/DefaultArchitectureServices.cs b/GFramework.Core/architecture/DefaultArchitectureServices.cs new file mode 100644 index 0000000..c38b1aa --- /dev/null +++ b/GFramework.Core/architecture/DefaultArchitectureServices.cs @@ -0,0 +1,11 @@ + +using GFramework.Core.events; +using GFramework.Core.ioc; + +namespace GFramework.Core.architecture; + +public class DefaultArchitectureServices: IArchitectureServices +{ + public IIocContainer Container { get; } = new IocContainer(); + public ITypeEventSystem TypeEventSystem { get; } = new TypeEventSystem(); +} \ No newline at end of file diff --git a/GFramework.Core/architecture/FunctionalArchitectureOptions.cs b/GFramework.Core/architecture/FunctionalArchitectureOptions.cs deleted file mode 100644 index e27b4cf..0000000 --- a/GFramework.Core/architecture/FunctionalArchitectureOptions.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace GFramework.Core.architecture; - -/// -/// 函数式架构选项实现,支持匿名实现 -/// -public class FunctionalArchitectureOptions(Func strictPhaseValidation, Func allowLateRegistration) - : IArchitectureOptions -{ - /// - /// 初始化 FunctionalArchitectureOptions 类的新实例 - /// - /// 用于确定是否启用严格阶段验证的函数 - /// 用于确定是否允许延迟注册的函数 - private readonly Func _strictPhaseValidation = strictPhaseValidation ?? throw new ArgumentNullException(nameof(strictPhaseValidation)); - private readonly Func _allowLateRegistration = allowLateRegistration ?? throw new ArgumentNullException(nameof(allowLateRegistration)); - - /// - /// 获取一个值,该值指示是否启用严格阶段验证 - /// - public bool StrictPhaseValidation => _strictPhaseValidation(); - - /// - /// 获取一个值,该值指示是否允许延迟注册 - /// - public bool AllowLateRegistration => _allowLateRegistration(); -} diff --git a/GFramework.Core/architecture/IArchitecture.cs b/GFramework.Core/architecture/IArchitecture.cs index 1cf1586..02eab4e 100644 --- a/GFramework.Core/architecture/IArchitecture.cs +++ b/GFramework.Core/architecture/IArchitecture.cs @@ -11,8 +11,25 @@ namespace GFramework.Core.architecture; /// 架构接口,定义了应用程序架构的核心功能,包括系统、模型、工具的注册和获取, /// 以及命令、查询、事件的发送和处理机制 /// -public interface IArchitecture +public interface IArchitecture: IAsyncInitializable { + /// + /// 初始化方法,用于执行对象的初始化操作 + /// + /// + /// 该方法通常用于设置初始状态、初始化成员变量或执行必要的预处理操作 + /// + void Initialize(); + + /// + /// 销毁方法,用于执行对象的清理和销毁操作 + /// + /// + /// 该方法通常用于释放资源、清理内存或执行必要的清理操作 + /// + void Destroy(); + + /// /// 注册系统实例到架构中 /// @@ -34,26 +51,7 @@ public interface IArchitecture /// 要注册的工具实例 void RegisterUtility(T utility) where T : IUtility; - /// - /// 从架构中获取指定类型的系统实例 - /// - /// 系统类型,必须是class且实现ISystem接口 - /// 指定类型的系统实例 - T? GetSystem() where T : class, ISystem; - /// - /// 从架构中获取指定类型的模型实例 - /// - /// 模型类型,必须是class且实现IModel接口 - /// 指定类型的模型实例 - T? GetModel() where T : class, IModel; - - /// - /// 从架构中获取指定类型的工具实例 - /// - /// 工具类型,必须是class且实现IUtility接口 - /// 指定类型的工具实例 - T? GetUtility() where T : class, IUtility; /// /// 发送并执行指定的命令 diff --git a/GFramework.Core/architecture/IArchitectureConfiguration.cs b/GFramework.Core/architecture/IArchitectureConfiguration.cs new file mode 100644 index 0000000..9fbe6a5 --- /dev/null +++ b/GFramework.Core/architecture/IArchitectureConfiguration.cs @@ -0,0 +1,19 @@ +using GFramework.Core.logging; + +namespace GFramework.Core.architecture; + +/// +/// 定义架构配置的接口,提供日志工厂、日志级别和架构选项的配置功能 +/// +public interface IArchitectureConfiguration +{ + /// + /// 获取或设置日志工厂,用于创建日志记录器实例 + /// + ILoggerFactory LoggerFactory { get; set; } + + /// + /// 获取或设置架构选项,包含架构相关的配置参数 + /// + ArchitectureOptions Options { get; set; } +} diff --git a/GFramework.Core/architecture/IArchitectureContext.cs b/GFramework.Core/architecture/IArchitectureContext.cs new file mode 100644 index 0000000..d46af92 --- /dev/null +++ b/GFramework.Core/architecture/IArchitectureContext.cs @@ -0,0 +1,84 @@ +using GFramework.Core.command; +using GFramework.Core.events; +using GFramework.Core.logging; +using GFramework.Core.model; +using GFramework.Core.query; +using GFramework.Core.system; +using GFramework.Core.utility; + +namespace GFramework.Core.architecture; + +/// +/// 架构上下文接口,提供对系统、模型、工具类的访问以及命令、查询、事件的发送和注册功能 +/// +public interface IArchitectureContext +{ + /// + /// 获取指定类型的系统实例 + /// + /// 系统类型,必须继承自ISystem接口 + /// 系统实例,如果不存在则返回null + TSystem? GetSystem() where TSystem : class, ISystem; + + /// + /// 获取指定类型的模型实例 + /// + /// 模型类型,必须继承自IModel接口 + /// 模型实例,如果不存在则返回null + TModel? GetModel() where TModel : class, IModel; + + /// + /// 获取指定类型的工具类实例 + /// + /// 工具类类型,必须继承自IUtility接口 + /// 工具类实例,如果不存在则返回null + TUtility? GetUtility() where TUtility : class, IUtility; + + /// + /// 发送一个命令 + /// + /// 要发送的命令 + void SendCommand(ICommand command); + + /// + /// 发送一个带返回值的命令 + /// + /// 命令执行结果类型 + /// 要发送的命令 + /// 命令执行结果 + TResult SendCommand(ICommand command); + + /// + /// 发送一个查询请求 + /// + /// 查询结果类型 + /// 要发送的查询 + /// 查询结果 + TResult SendQuery(IQuery query); + + /// + /// 发送一个事件 + /// + /// 事件类型 + void SendEvent(); + + /// + /// 发送一个带参数的事件 + /// + /// 事件类型 + /// 事件参数 + void SendEvent(TEvent e); + + /// + /// 注册事件处理器 + /// + /// 事件类型 + /// 事件处理委托 + /// 事件注销接口 + IUnRegister RegisterEvent(Action handler); + + /// + /// 获取日志记录器 + /// + ILogger Logger { get; } +} diff --git a/GFramework.Core/architecture/IArchitectureOptions.cs b/GFramework.Core/architecture/IArchitectureOptions.cs deleted file mode 100644 index 3226b70..0000000 --- a/GFramework.Core/architecture/IArchitectureOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace GFramework.Core.architecture; - -/// -/// 架构可配置选项接口 -/// -public interface IArchitectureOptions -{ - /// - /// 是否严格验证阶段转换 - /// - bool StrictPhaseValidation { get; } - - /// - /// 是否允许在 Ready 阶段后注册系统/模型 - /// - bool AllowLateRegistration { get; } -} \ No newline at end of file diff --git a/GFramework.Core/architecture/IArchitectureServices.cs b/GFramework.Core/architecture/IArchitectureServices.cs new file mode 100644 index 0000000..13f2fd5 --- /dev/null +++ b/GFramework.Core/architecture/IArchitectureServices.cs @@ -0,0 +1,22 @@ +using GFramework.Core.events; +using GFramework.Core.ioc; + +namespace GFramework.Core.architecture; + +/// +/// 架构服务接口,定义了框架核心架构所需的服务组件 +/// +public interface IArchitectureServices +{ + /// + /// 获取依赖注入容器 + /// + /// IIocContainer类型的依赖注入容器实例 + IIocContainer Container { get; } + + /// + /// 获取类型事件系统 + /// + /// ITypeEventSystem类型的事件系统实例 + ITypeEventSystem TypeEventSystem { get; } +} diff --git a/GFramework.Core/architecture/IAsyncInitializable.cs b/GFramework.Core/architecture/IAsyncInitializable.cs new file mode 100644 index 0000000..5f71077 --- /dev/null +++ b/GFramework.Core/architecture/IAsyncInitializable.cs @@ -0,0 +1,13 @@ +namespace GFramework.Core.architecture; + +/// +/// 定义异步初始化接口,用于需要异步初始化的组件或服务 +/// +public interface IAsyncInitializable +{ + /// + /// 异步初始化方法,用于执行组件或服务的异步初始化逻辑 + /// + /// 表示异步初始化操作的Task + Task InitializeAsync(); +} diff --git a/GFramework.Core/command/AbstractCommand.cs b/GFramework.Core/command/AbstractCommand.cs index 9618bab..751777c 100644 --- a/GFramework.Core/command/AbstractCommand.cs +++ b/GFramework.Core/command/AbstractCommand.cs @@ -1,33 +1,12 @@ -using GFramework.Core.architecture; -using GFramework.Core.rule; +using GFramework.Core.rule; namespace GFramework.Core.command; /// /// 抽象命令类,实现 ICommand 接口,为具体命令提供基础架构支持 /// -public abstract class AbstractCommand : ICommand +public abstract class AbstractCommand : ContextAwareBase, ICommand { - private IArchitecture _mArchitecture; - - /// - /// 获取命令所属的架构实例 - /// - /// IArchitecture 架构接口实例 - IArchitecture IBelongToArchitecture.GetArchitecture() - { - return _mArchitecture; - } - - /// - /// 设置命令所属的架构实例 - /// - /// 要设置的架构实例 - void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) - { - _mArchitecture = architecture; - } - /// /// 执行命令,调用抽象方法 OnExecute 来实现具体逻辑 /// @@ -46,28 +25,8 @@ public abstract class AbstractCommand : ICommand /// 带返回值的抽象命令类,实现 ICommand{TResult} 接口,为需要返回结果的命令提供基础架构支持 /// /// 命令执行后返回的结果类型 -public abstract class AbstractCommand : ICommand +public abstract class AbstractCommand : ContextAwareBase, ICommand { - private IArchitecture _mArchitecture; - - /// - /// 获取命令所属的架构实例 - /// - /// IArchitecture 架构接口实例 - IArchitecture IBelongToArchitecture.GetArchitecture() - { - return _mArchitecture; - } - - /// - /// 设置命令所属的架构实例 - /// - /// 要设置的架构实例 - void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) - { - _mArchitecture = architecture; - } - /// /// 执行命令,调用抽象方法 OnExecute 来实现具体逻辑并返回结果 /// diff --git a/GFramework.Core/command/ICanSendCommand.cs b/GFramework.Core/command/ICanSendCommand.cs deleted file mode 100644 index 47d3d08..0000000 --- a/GFramework.Core/command/ICanSendCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.command; - -/// -/// 定义一个可以发送命令的接口,继承自IBelongToArchitecture接口。 -/// 该接口用于标识那些具备发送命令能力的架构组件。 -/// -public interface ICanSendCommand : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/command/ICommand.cs b/GFramework.Core/command/ICommand.cs index 047e749..3e37b03 100644 --- a/GFramework.Core/command/ICommand.cs +++ b/GFramework.Core/command/ICommand.cs @@ -1,9 +1,4 @@ -using GFramework.Core.events; -using GFramework.Core.model; -using GFramework.Core.query; using GFramework.Core.rule; -using GFramework.Core.system; -using GFramework.Core.utility; namespace GFramework.Core.command; @@ -11,8 +6,7 @@ namespace GFramework.Core.command; /// 命令接口,定义了无返回值命令的基本契约 /// 该接口继承了多个框架能力接口,使命令可以访问架构、系统、模型、工具,并能够发送事件、命令和查询 /// -public interface ICommand : ICanSetArchitecture, ICanGetSystem, ICanGetModel, ICanGetUtility, - ICanSendEvent, ICanSendCommand, ICanSendQuery +public interface ICommand: IContextAware { /// /// 执行命令的核心方法 @@ -26,9 +20,7 @@ public interface ICommand : ICanSetArchitecture, ICanGetSystem, ICanGetModel, IC /// 该接口继承了多个框架能力接口,使命令可以访问架构、系统、模型、工具,并能够发送事件、命令和查询 /// /// 命令执行后返回的结果类型 -public interface ICommand : ICanSetArchitecture, ICanGetSystem, ICanGetModel, - ICanGetUtility, - ICanSendEvent, ICanSendCommand, ICanSendQuery +public interface ICommand: IContextAware { /// /// 执行命令的核心方法 diff --git a/GFramework.Core/controller/IController.cs b/GFramework.Core/controller/IController.cs index 1bc4733..cca5063 100644 --- a/GFramework.Core/controller/IController.cs +++ b/GFramework.Core/controller/IController.cs @@ -1,9 +1,4 @@ -using GFramework.Core.command; -using GFramework.Core.events; -using GFramework.Core.model; -using GFramework.Core.query; -using GFramework.Core.system; -using GFramework.Core.utility; +using GFramework.Core.rule; namespace GFramework.Core.controller; @@ -12,5 +7,4 @@ namespace GFramework.Core.controller; /// 该接口继承了多个框架核心接口,用于支持控制器的各种能力 /// 包括架构归属、命令发送、系统获取、模型获取、事件注册、查询发送和工具获取等功能 /// -public interface IController : ICanSendCommand, ICanGetSystem, ICanGetModel, - ICanRegisterEvent, ICanSendQuery, ICanGetUtility; \ No newline at end of file +public interface IController : IContextAware; \ No newline at end of file diff --git a/GFramework.Core/events/ICanRegisterEvent.cs b/GFramework.Core/events/ICanRegisterEvent.cs deleted file mode 100644 index 4f81c32..0000000 --- a/GFramework.Core/events/ICanRegisterEvent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.events; - -/// -/// 定义一个可以注册事件的接口,继承自IBelongToArchitecture接口。 -/// 该接口用于标识那些能够注册事件的对象,通常在框架的事件系统中使用。 -/// 实现此接口的类型表明它属于某个架构组件,并具备事件注册的能力。 -/// -public interface ICanRegisterEvent : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/events/ICanSendEvent.cs b/GFramework.Core/events/ICanSendEvent.cs deleted file mode 100644 index 0710c4e..0000000 --- a/GFramework.Core/events/ICanSendEvent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.events; - -/// -/// 定义一个可以发送事件的接口,继承自IBelongToArchitecture接口。 -/// 该接口用于标识那些具备发送事件能力的类型,通常作为架构中事件发送功能的基础接口。 -/// -public interface ICanSendEvent : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/events/ITypeEventSystem.cs b/GFramework.Core/events/ITypeEventSystem.cs new file mode 100644 index 0000000..491cc40 --- /dev/null +++ b/GFramework.Core/events/ITypeEventSystem.cs @@ -0,0 +1,35 @@ +namespace GFramework.Core.events; + +/// +/// 类型事件系统接口,定义基于类型的事件发送、注册和注销功能 +/// +public interface ITypeEventSystem +{ + /// + /// 发送事件,自动创建事件实例 + /// + /// 事件类型,必须具有无参构造函数 + void Send() where T : new(); + + /// + /// 发送指定的事件实例 + /// + /// 事件类型 + /// 事件实例 + void Send(T e); + + /// + /// 注册事件监听器 + /// + /// 事件类型 + /// 事件处理回调函数 + /// 反注册接口,用于注销事件监听 + IUnRegister Register(Action onEvent); + + /// + /// 注销事件监听器 + /// + /// 事件类型 + /// 要注销的事件处理回调函数 + void UnRegister(Action onEvent); +} diff --git a/GFramework.Core/events/TypeEventSystem.cs b/GFramework.Core/events/TypeEventSystem.cs index 3a89275..adadd71 100644 --- a/GFramework.Core/events/TypeEventSystem.cs +++ b/GFramework.Core/events/TypeEventSystem.cs @@ -1,54 +1,40 @@ -using GFramework.Core.logging; - -namespace GFramework.Core.events; +namespace GFramework.Core.events; /// -/// TypeEventSystem +/// 类型事件系统,提供基于类型的事件发送、注册和注销功能 /// -public class TypeEventSystem +public class TypeEventSystem : ITypeEventSystem { - public static readonly TypeEventSystem Global = new(); private readonly EasyEvents _mEvents = new(); - public void Send() where T : new() - { - var logger = Log.CreateLogger("Event"); - var eventType = typeof(T); - - logger.Debug($"Sending event: {eventType.Name}"); - _mEvents.GetEvent>()?.Trigger(new T()); - logger.Info($"Event sent: {eventType.Name}"); - } + /// + /// 发送事件,自动创建事件实例 + /// + /// 事件类型,必须具有无参构造函数 + public void Send() where T : new() => _mEvents.GetEvent>().Trigger(new T()); + /// + /// 发送指定的事件实例 + /// + /// 事件类型 + /// 事件实例 public void Send(T e) { - var logger = Log.CreateLogger("Event"); - var eventType = typeof(T); - - logger.Debug($"Sending event: {eventType.Name}"); - _mEvents.GetEvent>()?.Trigger(e); - logger.Info($"Event sent: {eventType.Name}"); + _mEvents.GetEvent>().Trigger(e); } - public IUnRegister Register(Action onEvent) - { - var logger = Log.CreateLogger("Event"); - var eventType = typeof(T); - - logger.Debug($"Registering event handler for: {eventType.Name}"); - var result = _mEvents.GetOrAddEvent>().Register(onEvent); - logger.Info($"Event handler registered for: {eventType.Name}"); - return result; - } + /// + /// 注册事件监听器 + /// + /// 事件类型 + /// 事件处理回调函数 + /// 反注册接口,用于注销事件监听 + public IUnRegister Register(Action onEvent) => _mEvents.GetOrAddEvent>().Register(onEvent); - public void UnRegister(Action onEvent) - { - var logger = Log.CreateLogger("Event"); - var eventType = typeof(T); - - logger.Debug($"Unregistering event handler for: {eventType.Name}"); - var e = _mEvents.GetEvent>(); - e?.UnRegister(onEvent); - logger.Info($"Event handler unregistered for: {eventType.Name}"); - } + /// + /// 注销事件监听器 + /// + /// 事件类型 + /// 要注销的事件处理回调函数 + public void UnRegister(Action onEvent) => _mEvents.GetEvent>().UnRegister(onEvent); } \ No newline at end of file diff --git a/GFramework.Core/extensions/CanGetExtensions.cs b/GFramework.Core/extensions/CanGetExtensions.cs deleted file mode 100644 index 335580c..0000000 --- a/GFramework.Core/extensions/CanGetExtensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -using GFramework.Core.model; -using GFramework.Core.system; -using GFramework.Core.utility; - -namespace GFramework.Core.extensions; - -/// -/// 提供获取模型对象扩展方法的静态类 -/// -public static class CanGetModelExtension -{ - /// - /// 从架构中获取指定类型的模型实例 - /// - /// 要获取的模型类型,必须实现IModel接口 - /// 实现ICanGetModel接口的对象实例 - /// 指定类型的模型实例 - public static T GetModel(this ICanGetModel self) where T : class, IModel - { - return self.GetArchitecture().GetModel(); - } -} - -/// -/// 提供获取系统对象扩展方法的静态类 -/// -public static class CanGetSystemExtension -{ - /// - /// 从架构中获取指定类型的系统实例 - /// - /// 要获取的系统类型,必须实现ISystem接口 - /// 实现ICanGetSystem接口的对象实例 - /// 指定类型的系统实例 - public static T GetSystem(this ICanGetSystem self) where T : class, ISystem - { - return self.GetArchitecture().GetSystem(); - } -} - -/// -/// 提供获取工具对象扩展方法的静态类 -/// -public static class CanGetUtilityExtension -{ - /// - /// 从架构中获取指定类型的工具实例 - /// - /// 要获取的工具类型,必须实现IUtility接口 - /// 实现ICanGetUtility接口的对象实例 - /// 指定类型的工具实例 - public static T GetUtility(this ICanGetUtility self) where T : class, IUtility - { - return self.GetArchitecture().GetUtility(); - } -} \ No newline at end of file diff --git a/GFramework.Core/extensions/CanRegisterEventExtensions.cs b/GFramework.Core/extensions/CanRegisterEventExtensions.cs deleted file mode 100644 index e059a62..0000000 --- a/GFramework.Core/extensions/CanRegisterEventExtensions.cs +++ /dev/null @@ -1,32 +0,0 @@ -using GFramework.Core.events; - -namespace GFramework.Core.extensions; - -/// -/// 事件注册扩展类,提供ICanRegisterEvent接口的扩展方法用于注册和注销事件 -/// -public static class CanRegisterEventExtensions -{ - /// - /// 注册指定类型的事件处理函数 - /// - /// 事件数据类型 - /// 实现ICanRegisterEvent接口的对象实例 - /// 事件处理回调函数 - /// 返回事件注销器接口,可用于后续注销事件 - public static IUnRegister RegisterEvent(this ICanRegisterEvent self, Action onEvent) - { - return self.GetArchitecture().RegisterEvent(onEvent); - } - - /// - /// 注销指定类型的事件处理函数 - /// - /// 事件数据类型 - /// 实现ICanRegisterEvent接口的对象实例 - /// 要注销的事件处理回调函数 - public static void UnRegisterEvent(this ICanRegisterEvent self, Action onEvent) - { - self.GetArchitecture().UnRegisterEvent(onEvent); - } -} \ No newline at end of file diff --git a/GFramework.Core/extensions/CanSendExtensions.cs b/GFramework.Core/extensions/CanSendExtensions.cs deleted file mode 100644 index f72c216..0000000 --- a/GFramework.Core/extensions/CanSendExtensions.cs +++ /dev/null @@ -1,89 +0,0 @@ -using GFramework.Core.command; -using GFramework.Core.events; -using GFramework.Core.query; - -namespace GFramework.Core.extensions; - -/// -/// 提供发送命令功能的扩展类 -/// -public static class CanSendCommandExtension -{ - /// - /// 发送指定类型的命令,该命令类型必须实现ICommand接口且具有无参构造函数 - /// - /// 命令类型,必须实现ICommand接口且具有无参构造函数 - /// 实现ICanSendCommand接口的对象实例 - public static void SendCommand(this ICanSendCommand self) where T : ICommand, new() - { - self.GetArchitecture().SendCommand(new T()); - } - - /// - /// 发送指定的命令实例 - /// - /// 命令类型,必须实现ICommand接口 - /// 实现ICanSendCommand接口的对象实例 - /// 要发送的命令实例 - public static void SendCommand(this ICanSendCommand self, T command) where T : ICommand - { - self.GetArchitecture().SendCommand(command); - } - - /// - /// 发送带有返回值的命令并获取执行结果 - /// - /// 命令执行结果的类型 - /// 实现ICanSendCommand接口的对象实例 - /// 要发送的命令实例,必须实现ICommand<TResult>接口 - /// 命令执行后的返回结果 - public static TResult SendCommand(this ICanSendCommand self, ICommand command) - { - return self.GetArchitecture().SendCommand(command); - } -} - -/// -/// 提供发送事件功能的扩展类 -/// -public static class CanSendEventExtension -{ - /// - /// 发送指定类型的事件,该事件类型必须具有无参构造函数 - /// - /// 事件类型,必须具有无参构造函数 - /// 实现ICanSendEvent接口的对象实例 - public static void SendEvent(this ICanSendEvent self) where T : new() - { - self.GetArchitecture().SendEvent(); - } - - /// - /// 发送指定的事件实例 - /// - /// 事件类型 - /// 实现ICanSendEvent接口的对象实例 - /// 要发送的事件实例 - public static void SendEvent(this ICanSendEvent self, T e) - { - self.GetArchitecture().SendEvent(e); - } -} - -/// -/// 提供发送查询功能的扩展类 -/// -public static class CanSendQueryExtension -{ - /// - /// 发送查询请求并获取查询结果 - /// - /// 查询结果的类型 - /// 实现ICanSendQuery接口的对象实例 - /// 要发送的查询实例,必须实现IQuery<TResult>接口 - /// 查询操作的返回结果 - public static TResult SendQuery(this ICanSendQuery self, IQuery query) - { - return self.GetArchitecture().SendQuery(query); - } -} \ No newline at end of file diff --git a/GFramework.Core/ioc/IIocContainer.cs b/GFramework.Core/ioc/IIocContainer.cs new file mode 100644 index 0000000..9eb3b13 --- /dev/null +++ b/GFramework.Core/ioc/IIocContainer.cs @@ -0,0 +1,117 @@ +using GFramework.Core.rule; +using GFramework.Core.system; + +namespace GFramework.Core.ioc; + +/// +/// 依赖注入容器接口,定义了服务注册、解析和管理的基本操作 +/// +public interface IIocContainer:IContextAware{ + /// + /// 初始化方法 + /// + void Init(); + #region Register Methods + + /// + /// 注册单例 + /// 一个类型只允许一个实例 + /// + /// 要注册为单例的类型 + /// 要注册的单例实例 + /// 当该类型已经注册过单例时抛出异常 + void RegisterSingleton(T instance); + + + /// + /// 注册一个实例及其所有可赋值的接口类型到容器中 + /// + /// 实例的类型 + /// 要注册的实例对象,不能为null + void RegisterPlurality(T instance); + + /// + /// 注册系统实例,将其绑定到其所有实现的接口上 + /// + /// 系统实例对象 + void RegisterSystem(ISystem system); + + /// + /// 注册指定类型的实例到容器中 + /// + /// 要注册的实例类型 + /// 要注册的实例对象,不能为null + void Register(T instance); + + /// + /// 注册指定类型的实例到容器中 + /// + /// 要注册的实例类型 + /// 要注册的实例对象 + void Register(Type type, object instance); + + #endregion + + #region Get Methods + + /// + /// 获取单个实例(通常用于具体类型) + /// 如果存在多个,只返回第一个 + /// + /// 期望获取的实例类型 + /// 找到的第一个实例;如果未找到则返回 null + T? Get() where T : class; + + /// + /// 获取指定类型的必需实例 + /// + /// 期望获取的实例类型 + /// 找到的唯一实例 + /// 当没有注册实例或注册了多个实例时抛出 + T GetRequired() where T : class; + + /// + /// 获取指定类型的所有实例(接口 / 抽象类推荐使用) + /// + /// 期望获取的实例类型 + /// 所有符合条件的实例列表;如果没有则返回空数组 + IReadOnlyList GetAll() where T : class; + + /// + /// 获取并排序(系统调度专用) + /// + /// 期望获取的实例类型 + /// 比较器委托,定义排序规则 + /// 按指定方式排序后的实例列表 + IReadOnlyList GetAllSorted(Comparison comparison) where T : class; + + #endregion + + #region Utility Methods + + /// + /// 检查容器中是否包含指定类型的实例 + /// + /// 要检查的类型 + /// 如果容器中包含指定类型的实例则返回true,否则返回false + bool Contains(); + + /// + /// 判断容器中是否包含某个具体的实例对象 + /// + /// 待查询的实例对象 + /// 若容器中包含该实例则返回true,否则返回false + bool ContainsInstance(object instance); + + /// + /// 清空容器中的所有实例 + /// + void Clear(); + + /// + /// 冻结容器,防止后续修改 + /// + void Freeze(); + + #endregion +} \ No newline at end of file diff --git a/GFramework.Core/ioc/IocContainer.cs b/GFramework.Core/ioc/IocContainer.cs index 3a0bed1..524b7ac 100644 --- a/GFramework.Core/ioc/IocContainer.cs +++ b/GFramework.Core/ioc/IocContainer.cs @@ -1,4 +1,5 @@ using GFramework.Core.logging; +using GFramework.Core.rule; using GFramework.Core.system; namespace GFramework.Core.ioc; @@ -6,7 +7,7 @@ namespace GFramework.Core.ioc; /// /// IOC容器类,用于管理对象的注册和获取 /// -public class IocContainer +public class IocContainer : ContextAwareBase, IIocContainer { #region Core @@ -22,6 +23,8 @@ public class IocContainer /// private readonly Dictionary> _typeIndex = new(); + private ILogger _logger = null!; + #endregion #region Lock @@ -48,6 +51,11 @@ public class IocContainer #region Register + public void Init() + { + _logger = Context.Logger; + } + /// /// 注册单例 /// 一个类型只允许一个实例 @@ -58,27 +66,25 @@ public class IocContainer public void RegisterSingleton(T instance) { var type = typeof(T); - var logger = Log.CreateLogger("IOC"); - _lock.EnterWriteLock(); try { if (_frozen) { var errorMsg = "IocContainer is frozen"; - logger.Error(errorMsg); + _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } if (_typeIndex.TryGetValue(type, out var set) && set.Count > 0) { var errorMsg = $"Singleton already registered for type: {type.Name}"; - logger.Error(errorMsg); + _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } RegisterInternal(type, instance!); - logger.Debug($"Singleton registered: {type.Name}"); + _logger.Debug($"Singleton registered: {type.Name}"); } finally { @@ -95,8 +101,6 @@ public class IocContainer public void RegisterPlurality(T instance) { var concreteType = instance!.GetType(); - var logger = Log.CreateLogger("IOC"); - // 获取实例类型直接实现的所有接口,并筛选出可以赋值给T类型的接口 var interfaces = concreteType.GetInterfaces() .Where(typeof(T).IsAssignableFrom); @@ -106,13 +110,13 @@ public class IocContainer { // 注册具体类型 RegisterInternal(concreteType, instance); - logger.Debug($"Registered concrete type: {concreteType.Name}"); + _logger.Debug($"Registered concrete type: {concreteType.Name}"); // 注册所有匹配的接口类型 foreach (var itf in interfaces) { RegisterInternal(itf, instance); - logger.Debug($"Registered interface: {itf.Name} for {concreteType.Name}"); + _logger.Debug($"Registered interface: {itf.Name} for {concreteType.Name}"); } } finally @@ -130,8 +134,8 @@ public class IocContainer { if (_frozen) { - var errorMsg = "IocContainer is frozen"; - Log.CreateLogger("IOC").Error(errorMsg); + const string errorMsg = "IocContainer is frozen"; + _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } @@ -209,19 +213,17 @@ public class IocContainer /// 找到的第一个实例;如果未找到则返回 null public T? Get() where T : class { - var logger = Log.CreateLogger("IOC"); - _lock.EnterReadLock(); try { if (_typeIndex.TryGetValue(typeof(T), out var set) && set.Count > 0) { var result = set.First() as T; - logger.Debug($"Retrieved instance: {typeof(T).Name}"); + _logger.Debug($"Retrieved instance: {typeof(T).Name}"); return result; } - logger.Debug($"No instance found for type: {typeof(T).Name}"); + _logger.Debug($"No instance found for type: {typeof(T).Name}"); return null; } finally @@ -239,23 +241,22 @@ public class IocContainer /// 当没有注册实例或注册了多个实例时抛出 public T GetRequired() where T : class { - var logger = Log.CreateLogger("IOC"); var list = GetAll(); switch (list.Count) { case 0: var notFoundMsg = $"No instance registered for {typeof(T).Name}"; - logger.Error(notFoundMsg); + _logger.Error(notFoundMsg); throw new InvalidOperationException(notFoundMsg); case 1: - logger.Debug($"Retrieved required instance: {typeof(T).Name}"); + _logger.Debug($"Retrieved required instance: {typeof(T).Name}"); return list[0]; default: var multipleMsg = $"Multiple instances registered for {typeof(T).Name}"; - logger.Error(multipleMsg); + _logger.Error(multipleMsg); throw new InvalidOperationException(multipleMsg); } } @@ -358,14 +359,12 @@ public class IocContainer /// public void Freeze() { - var logger = Log.CreateLogger("IOC"); - // 获取写锁以确保线程安全的状态修改 _lock.EnterWriteLock(); try { _frozen = true; - logger.Info("IOC Container frozen - no further registrations allowed"); + _logger.Info("IOC Container frozen - no further registrations allowed"); } finally { diff --git a/GFramework.Core/logging/ConsoleLogger.cs b/GFramework.Core/logging/ConsoleLogger.cs index 6eb0283..2925fa0 100644 --- a/GFramework.Core/logging/ConsoleLogger.cs +++ b/GFramework.Core/logging/ConsoleLogger.cs @@ -1,92 +1,406 @@ namespace GFramework.Core.logging; /// -/// 控制台日志记录器实现,支持日志级别控制和格式化输出 +/// 控制台日志记录器 /// -public sealed class ConsoleLogger : ILog +public sealed class ConsoleLogger : ILogger { private readonly LogLevel _minLevel; - private readonly string? _category; - private readonly TextWriter? _writer; + private readonly string _name; + private readonly TextWriter _writer; private readonly bool _useColors; /// - /// 构造函数 + /// 初始化控制台日志记录器实例 /// - /// 日志类别 - /// 最小日志级别(默认Info) - /// 输出流(默认控制台) - /// 是否使用颜色输出(默认true) + /// 日志记录器名称,默认为根日志记录器名称 + /// 最小日志级别,默认为Info级别 + /// 文本写入器,默认为控制台输出 + /// 是否使用颜色输出,默认为true public ConsoleLogger( - string? category = null, + string? name = null, LogLevel minLevel = LogLevel.Info, TextWriter? writer = null, bool useColors = true) { - _category = category; + _name = name ?? ILogger.RootLoggerName; _minLevel = minLevel; _writer = writer ?? Console.Out; _useColors = useColors && _writer == Console.Out; } + #region Metadata + /// - /// 记录日志消息 + /// 获取日志记录器名称 /// - /// 日志级别 - /// 日志消息 - /// 异常信息(可选) - /// 上下文信息(可选) - public void Log(LogLevel level, string message, Exception? exception = null, object? context = null) - { - if (!IsEnabled(level)) - return; + /// 日志记录器名称 + public string Name() => _name; - var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); - var levelStr = level.ToString().ToUpper().PadRight(7); - var categoryStr = _category != null ? $"[{_category}] " : ""; - var contextStr = context != null ? $" | Context: {FormatContext(context)}" : ""; - var exceptionStr = exception != null ? $"\nException: {exception}" : ""; + #endregion - var logMessage = $"[{timestamp}] {levelStr} {categoryStr}{message}{contextStr}{exceptionStr}"; + #region Level Checks - if (_useColors) - { - WriteColored(level, logMessage); - } - else - { - _writer!.WriteLine(logMessage); - } - } + /// + /// 检查是否启用Trace级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsTraceEnabled() => IsEnabled(LogLevel.Trace); + + /// + /// 检查是否启用Debug级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsDebugEnabled() => IsEnabled(LogLevel.Debug); + + /// + /// 检查是否启用Info级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsInfoEnabled() => IsEnabled(LogLevel.Info); + + /// + /// 检查是否启用Warn级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsWarnEnabled() => IsEnabled(LogLevel.Warning); + + /// + /// 检查是否启用Error级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsErrorEnabled() => IsEnabled(LogLevel.Error); + + /// + /// 检查是否启用Fatal级别日志 + /// + /// 如果启用返回true,否则返回false + public bool IsFatalEnabled() => IsEnabled(LogLevel.Fatal); /// /// 检查指定日志级别是否启用 /// /// 要检查的日志级别 - /// 如果启用则返回true,否则返回false - public bool IsEnabled(LogLevel level) => level >= _minLevel; + /// 如果启用返回true,否则返回false + private bool IsEnabled(LogLevel level) => level >= _minLevel; + + #endregion + + #region Trace /// - /// 获取当前最小日志级别 + /// 记录Trace级别日志消息 /// - public LogLevel MinLevel => _minLevel; + /// 日志消息 + public void Trace(string msg) => LogIfEnabled(LogLevel.Trace, msg); /// - /// 使用颜色写入日志消息 + /// 记录Trace级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Trace(string format, object arg) => LogIfEnabled(LogLevel.Trace, format, arg); + + /// + /// 记录Trace级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Trace(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Trace, format, arg1, arg2); + + /// + /// 记录Trace级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Trace(string format, params object[] arguments) => LogIfEnabled(LogLevel.Trace, format, arguments); + + /// + /// 记录Trace级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Trace(string msg, Exception t) => LogException(LogLevel.Trace, msg, t); + + #endregion + + #region Debug + + /// + /// 记录Debug级别日志消息 + /// + /// 日志消息 + public void Debug(string msg) => LogIfEnabled(LogLevel.Debug, msg); + + /// + /// 记录Debug级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Debug(string format, object arg) => LogIfEnabled(LogLevel.Debug, format, arg); + + /// + /// 记录Debug级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Debug(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Debug, format, arg1, arg2); + + /// + /// 记录Debug级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Debug(string format, params object[] arguments) => LogIfEnabled(LogLevel.Debug, format, arguments); + + /// + /// 记录Debug级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Debug(string msg, Exception t) => LogException(LogLevel.Debug, msg, t); + + #endregion + + #region Info + + /// + /// 记录Info级别日志消息 + /// + /// 日志消息 + public void Info(string msg) => LogIfEnabled(LogLevel.Info, msg); + + /// + /// 记录Info级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Info(string format, object arg) => LogIfEnabled(LogLevel.Info, format, arg); + + /// + /// 记录Info级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Info(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Info, format, arg1, arg2); + + /// + /// 记录Info级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Info(string format, params object[] arguments) => LogIfEnabled(LogLevel.Info, format, arguments); + + /// + /// 记录Info级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Info(string msg, Exception t) => LogException(LogLevel.Info, msg, t); + + #endregion + + #region Warn + + /// + /// 记录Warn级别日志消息 + /// + /// 日志消息 + public void Warn(string msg) => LogIfEnabled(LogLevel.Warning, msg); + + /// + /// 记录Warn级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Warn(string format, object arg) => LogIfEnabled(LogLevel.Warning, format, arg); + + /// + /// 记录Warn级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Warn(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Warning, format, arg1, arg2); + + /// + /// 记录Warn级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Warn(string format, params object[] arguments) => LogIfEnabled(LogLevel.Warning, format, arguments); + + /// + /// 记录Warn级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Warn(string msg, Exception t) => LogException(LogLevel.Warning, msg, t); + + #endregion + + #region Error + + /// + /// 记录Error级别日志消息 + /// + /// 日志消息 + public void Error(string msg) => LogIfEnabled(LogLevel.Error, msg); + + /// + /// 记录Error级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Error(string format, object arg) => LogIfEnabled(LogLevel.Error, format, arg); + + /// + /// 记录Error级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Error(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Error, format, arg1, arg2); + + /// + /// 记录Error级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Error(string format, params object[] arguments) => LogIfEnabled(LogLevel.Error, format, arguments); + + /// + /// 记录Error级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Error(string msg, Exception t) => LogException(LogLevel.Error, msg, t); + + #endregion + + #region Fatal + + /// + /// 记录Fatal级别日志消息 + /// + /// 日志消息 + public void Fatal(string msg) => LogIfEnabled(LogLevel.Fatal, msg); + + /// + /// 记录Fatal级别日志消息(带格式化参数) + /// + /// 格式化字符串 + /// 格式化参数 + public void Fatal(string format, object arg) => LogIfEnabled(LogLevel.Fatal, format, arg); + + /// + /// 记录Fatal级别日志消息(带两个格式化参数) + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Fatal(string format, object arg1, object arg2) => LogIfEnabled(LogLevel.Fatal, format, arg1, arg2); + + /// + /// 记录Fatal级别日志消息(带多个格式化参数) + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Fatal(string format, params object[] arguments) => LogIfEnabled(LogLevel.Fatal, format, arguments); + + /// + /// 记录Fatal级别异常日志 + /// + /// 日志消息 + /// 异常对象 + public void Fatal(string msg, Exception t) => LogException(LogLevel.Fatal, msg, t); + + #endregion + + #region Internal Core + + /// + /// 如果指定级别已启用,则记录日志消息 /// /// 日志级别 - /// 要写入的消息 + /// 日志消息 + private void LogIfEnabled(LogLevel level, string message) + { + if (!IsEnabled(level)) return; + LogInternal(level, message, null); + } + + /// + /// 如果指定级别已启用,则记录格式化日志消息 + /// + /// 日志级别 + /// 格式化字符串 + /// 格式化参数数组 + private void LogIfEnabled(LogLevel level, string format, params object[] args) + { + if (!IsEnabled(level)) return; + LogInternal(level, string.Format(format, args), null); + } + + /// + /// 如果指定级别已启用,则记录异常日志 + /// + /// 日志级别 + /// 日志消息 + /// 异常对象 + private void LogException(LogLevel level, string message, Exception exception) + { + if (!IsEnabled(level)) return; + LogInternal(level, message, exception); + } + + /// + /// 内部日志记录方法 + /// + /// 日志级别 + /// 日志消息 + /// 异常对象(可选) + private void LogInternal(LogLevel level, string message, Exception? exception) + { + var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + var levelStr = level.ToString().ToUpper().PadRight(7); + var log = $"[{timestamp}] {levelStr} [{_name}] {message}"; + + // 添加异常信息到日志 + if (exception != null) + { + log += Environment.NewLine + exception; + } + + if (_useColors) + { + WriteColored(level, log); + } + else + { + _writer.WriteLine(log); + } + } + + /// + /// 以指定颜色写入日志消息 + /// + /// 日志级别 + /// 日志消息 private void WriteColored(LogLevel level, string message) { - var originalColor = Console.ForegroundColor; + var original = Console.ForegroundColor; try { Console.ForegroundColor = GetColor(level); - _writer!.WriteLine(message); + _writer.WriteLine(message); } finally { - Console.ForegroundColor = originalColor; + Console.ForegroundColor = original; } } @@ -94,86 +408,17 @@ public sealed class ConsoleLogger : ILog /// 根据日志级别获取对应的颜色 /// /// 日志级别 - /// 对应的控制台颜色 - private static ConsoleColor GetColor(LogLevel level) + /// 控制台颜色 + private static ConsoleColor GetColor(LogLevel level) => level switch { - return level switch - { - LogLevel.Trace => ConsoleColor.Gray, - LogLevel.Debug => ConsoleColor.Cyan, - LogLevel.Info => ConsoleColor.White, - LogLevel.Warning => ConsoleColor.Yellow, - LogLevel.Error => ConsoleColor.Red, - LogLevel.Fatal => ConsoleColor.Magenta, - _ => ConsoleColor.White - }; - } + LogLevel.Trace => ConsoleColor.DarkGray, + LogLevel.Debug => ConsoleColor.Cyan, + LogLevel.Info => ConsoleColor.White, + LogLevel.Warning => ConsoleColor.Yellow, + LogLevel.Error => ConsoleColor.Red, + LogLevel.Fatal => ConsoleColor.Magenta, + _ => ConsoleColor.White + }; - /// - /// 格式化上下文对象为字符串 - /// - /// 上下文对象 - /// 格式化后的字符串 - private static string FormatContext(object context) - { - return context switch - { - string str => str, - int num => num.ToString(), - null => "null", - _ => $"{context.GetType().Name}: {context}" - }; - } - - // 快捷方法实现 - - /// - /// 记录信息级别日志 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Info(string msg, object? ctx = null) - => Log(LogLevel.Info, msg, null, ctx); - - /// - /// 记录错误级别日志 - /// - /// 日志消息 - /// 异常信息(可选) - /// 上下文信息(可选) - public void Error(string msg, Exception? ex = null, object? ctx = null) - => Log(LogLevel.Error, msg, ex, ctx); - - /// - /// 记录调试级别日志 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Debug(string msg, object? ctx = null) - => Log(LogLevel.Debug, msg, null, ctx); - - /// - /// 记录跟踪级别日志 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Trace(string msg, object? ctx = null) - => Log(LogLevel.Trace, msg, null, ctx); - - /// - /// 记录警告级别日志 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Warn(string msg, object? ctx = null) - => Log(LogLevel.Warning, msg, null, ctx); - - /// - /// 记录致命错误级别日志 - /// - /// 日志消息 - /// 异常信息(可选) - /// 上下文信息(可选) - public void Fatal(string msg,Exception? ex = null, object? ctx = null) - => Log(LogLevel.Fatal, msg, ex, ctx); + #endregion } diff --git a/GFramework.Core/logging/ConsoleLoggerFactory.cs b/GFramework.Core/logging/ConsoleLoggerFactory.cs new file mode 100644 index 0000000..ec0b8a6 --- /dev/null +++ b/GFramework.Core/logging/ConsoleLoggerFactory.cs @@ -0,0 +1,17 @@ +namespace GFramework.Core.logging; + +/// +/// 控制台日志提供程序,用于创建控制台日志记录器实例 +/// +public class ConsoleLoggerFactory : ILoggerFactory +{ + /// + /// 获取指定名称的控制台日志记录器实例 + /// + /// 日志记录器的名称 + /// 控制台日志记录器实例 + public ILogger GetLogger(string name) + { + return new ConsoleLogger(name); + } +} diff --git a/GFramework.Core/logging/ILog.cs b/GFramework.Core/logging/ILog.cs deleted file mode 100644 index a4037a2..0000000 --- a/GFramework.Core/logging/ILog.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace GFramework.Core.logging; - -/// -/// 定义日志记录接口,提供日志记录和级别检查功能 -/// -public interface ILog -{ - /// - /// 记录指定级别的日志消息 - /// - /// 日志级别 - /// 日志消息内容 - /// 可选的异常对象,默认为null - /// 可选的上下文对象,默认为null - void Log( - LogLevel level, - string message, - Exception? exception = null, - object? context = null - ); - - /// - /// 检查指定日志级别是否启用 - /// - /// 要检查的日志级别 - /// 如果指定级别已启用则返回true,否则返回false - bool IsEnabled(LogLevel level); - - /// - /// 记录信息级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - void Info(string msg, object? ctx = null); - - /// - /// 记录错误级别日志 - /// - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - void Error(string msg, Exception? ex = null, object? ctx = null); - - /// - /// 记录调试级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - void Debug(string msg, object? ctx = null); - - /// - /// 记录跟踪级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - void Trace(string msg, object? ctx = null); - - /// - /// 记录警告级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - void Warn(string msg, object? ctx = null); - - /// - /// 记录致命错误级别日志 - /// - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - void Fatal(string msg, Exception? ex = null,object? ctx = null); -} diff --git a/GFramework.Core/logging/ILogger.cs b/GFramework.Core/logging/ILogger.cs new file mode 100644 index 0000000..495272c --- /dev/null +++ b/GFramework.Core/logging/ILogger.cs @@ -0,0 +1,330 @@ +namespace GFramework.Core.logging; + +/// +/// 定义日志记录接口,提供日志记录和级别检查功能 +/// +public interface ILogger +{ + /// + /// 根日志记录器的名称常量 + /// + public const string RootLoggerName = "ROOT"; + + /// + /// 获取日志记录器的名称 + /// + /// 日志记录器的名称 + string Name(); + + #region Level Enabled Check + + /// + /// 检查是否启用了Trace级别日志 + /// + /// 如果启用了Trace级别日志则返回true,否则返回false + bool IsTraceEnabled(); + + /// + /// 检查是否启用了Debug级别日志 + /// + /// 如果启用了Debug级别日志则返回true,否则返回false + bool IsDebugEnabled(); + + /// + /// 检查是否启用了Info级别日志 + /// + /// 如果启用了Info级别日志则返回true,否则返回false + bool IsInfoEnabled(); + + /// + /// 检查是否启用了Warn级别日志 + /// + /// 如果启用了Warn级别日志则返回true,否则返回false + bool IsWarnEnabled(); + + /// + /// 检查是否启用了Error级别日志 + /// + /// 如果启用了Error级别日志则返回true,否则返回false + bool IsErrorEnabled(); + + /// + /// 检查是否启用了Fatal级别日志 + /// + /// 如果启用了Fatal级别日志则返回true,否则返回false + bool IsFatalEnabled(); + + /// + /// 检查指定的日志级别是否已启用 + /// + /// 要检查的日志级别 + /// 如果指定的日志级别已启用则返回true,否则返回false + bool IsEnabledForLevel(LogLevel level) + { + return level switch + { + LogLevel.Trace => IsTraceEnabled(), + LogLevel.Debug => IsDebugEnabled(), + LogLevel.Info => IsInfoEnabled(), + LogLevel.Warning => IsWarnEnabled(), + LogLevel.Error => IsErrorEnabled(), + LogLevel.Fatal => IsFatalEnabled(), + _ => throw new ArgumentException("Level [" + level + "] not recognized.") + }; + } + + #endregion + + + #region Trace Logging Methods + + /// + /// 记录 TRACE 级别的消息 + /// + /// 要记录的消息字符串 + void Trace(string msg); + + /// + /// 根据指定格式和参数记录 TRACE 级别的消息 + /// 当日志记录器对 TRACE 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Trace(string format, object arg); + + /// + /// 根据指定格式和参数记录 TRACE 级别的消息 + /// 当日志记录器对 TRACE 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Trace(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 TRACE 级别的消息 + /// 当日志记录器对 TRACE 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Trace(string format, params object[] arguments); + + /// + /// 使用伴随消息在 TRACE 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Trace(string msg, Exception t); + + #endregion + + #region Debug Logging Methods + + /// + /// 记录 DEBUG 级别的消息 + /// + /// 要记录的消息字符串 + void Debug(string msg); + + /// + /// 根据指定格式和参数记录 DEBUG 级别的消息 + /// 当日志记录器对 DEBUG 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Debug(string format, object arg); + + /// + /// 根据指定格式和参数记录 DEBUG 级别的消息 + /// 当日志记录器对 DEBUG 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Debug(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 DEBUG 级别的消息 + /// 当日志记录器对 DEBUG 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Debug(string format, params object[] arguments); + + /// + /// 使用伴随消息在 DEBUG 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Debug(string msg, Exception t); + + #endregion + + #region Info Logging Methods + + /// + /// 记录 INFO 级别的消息 + /// + /// 要记录的消息字符串 + void Info(string msg); + + /// + /// 根据指定格式和参数记录 INFO 级别的消息 + /// 当日志记录器对 INFO 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Info(string format, object arg); + + /// + /// 根据指定格式和参数记录 INFO 级别的消息 + /// 当日志记录器对 INFO 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Info(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 INFO 级别的消息 + /// 当日志记录器对 INFO 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Info(string format, params object[] arguments); + + /// + /// 使用伴随消息在 INFO 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Info(string msg, Exception t); + + #endregion + + #region Warn Logging Methods + + /// + /// 记录 WARN 级别的消息 + /// + /// 要记录的消息字符串 + void Warn(string msg); + + /// + /// 根据指定格式和参数记录 WARN 级别的消息 + /// 当日志记录器对 WARN 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Warn(string format, object arg); + + /// + /// 根据指定格式和参数记录 WARN 级别的消息 + /// 当日志记录器对 WARN 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Warn(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 WARN 级别的消息 + /// 当日志记录器对 WARN 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Warn(string format, params object[] arguments); + + /// + /// 使用伴随消息在 WARN 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Warn(string msg, Exception t); + + #endregion + + #region Error Logging Methods + + /// + /// 记录 ERROR 级别的消息 + /// + /// 要记录的消息字符串 + void Error(string msg); + + /// + /// 根据指定格式和参数记录 ERROR 级别的消息 + /// 当日志记录器对 ERROR 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Error(string format, object arg); + + /// + /// 根据指定格式和参数记录 ERROR 级别的消息 + /// 当日志记录器对 ERROR 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Error(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 ERROR 级别的消息 + /// 当日志记录器对 ERROR 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Error(string format, params object[] arguments); + + /// + /// 使用伴随消息在 ERROR 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Error(string msg, Exception t); + + #endregion + + #region Fatal Logging Methods + + /// + /// 记录 FATAL 级别的消息 + /// + /// 要记录的消息字符串 + void Fatal(string msg); + + /// + /// 根据指定格式和参数记录 FATAL 级别的消息 + /// 当日志记录器对 FATAL 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 参数 + void Fatal(string format, object arg); + + /// + /// 根据指定格式和参数记录 FATAL 级别的消息 + /// 当日志记录器对 FATAL 级别禁用时,此方法可避免不必要的对象创建 + /// + /// 格式字符串 + /// 第一个参数 + /// 第二个参数 + void Fatal(string format, object arg1, object arg2); + + /// + /// 根据指定格式和参数数组记录 FATAL 级别的消息 + /// 当日志记录器对 FATAL 级别禁用时,此方法可避免不必要的字符串连接 + /// + /// 格式字符串 + /// 参数数组 + void Fatal(string format, params object[] arguments); + + /// + /// 使用伴随消息在 FATAL 级别记录异常 + /// + /// 伴随异常的消息 + /// 要记录的异常 + void Fatal(string msg, Exception t); + + #endregion +} diff --git a/GFramework.Core/logging/ILoggerFactory.cs b/GFramework.Core/logging/ILoggerFactory.cs index d118eba..a347016 100644 --- a/GFramework.Core/logging/ILoggerFactory.cs +++ b/GFramework.Core/logging/ILoggerFactory.cs @@ -6,16 +6,9 @@ public interface ILoggerFactory { /// - /// 创建指定类别的日志记录器实例 + /// 根据指定的名称获取日志记录器实例 /// - /// 日志类别,用于区分不同的日志源 - /// 返回指定类别的日志记录器实例 - ILog Create(string category); - - /// - /// 创建全局日志记录器实例 - /// - /// 返回全局日志记录器实例 - ILog CreateGlobalLogger(); -} - + /// 日志记录器的名称 + /// 指定名称的日志记录器实例 + ILogger GetLogger(string name); +} \ No newline at end of file diff --git a/GFramework.Core/logging/Log.cs b/GFramework.Core/logging/Log.cs deleted file mode 100644 index 4f0c9cd..0000000 --- a/GFramework.Core/logging/Log.cs +++ /dev/null @@ -1,149 +0,0 @@ -namespace GFramework.Core.logging; - -/// -/// 日志记录的静态类,提供全局日志记录功能 -/// -public static class Log -{ - private static ILoggerFactory? _factory; - private static LogConfig? _config; - - /// - /// 获取当前的日志记录器实例 - /// - public static ILog Instance { get; private set; } = new ConsoleLogger(); - - /// - /// 获取当前的日志配置 - /// - public static LogConfig Config => _config ??= new LogConfig(); - - /// - /// 设置日志记录器实例 - /// - /// 要设置的日志记录器,如果为 null 则使用默认的ConsoleLogger - public static void SetLogger(ILog? logger) - { - Instance = logger ?? new ConsoleLogger(); - } - - /// - /// 使用日志工厂创建日志记录器 - /// - /// 日志工厂实例 - public static void SetLoggerFactory(ILoggerFactory factory) - { - _factory = factory ?? throw new ArgumentNullException(nameof(factory)); - Instance = _factory.CreateGlobalLogger(); - } - - /// - /// 使用日志配置初始化日志系统 - /// - /// 日志配置 - public static void Initialize(LogConfig config) - { - _config = config ?? throw new ArgumentNullException(nameof(config)); - _factory = new LoggerFactory(config); - Instance = _factory.CreateGlobalLogger(); - } - - /// - /// 快速配置日志系统 - /// - /// 最小日志级别(默认为Info) - /// 是否启用控制台输出(默认为true) - /// 是否使用彩色输出(默认为true) - /// 是否启用文件输出(默认为false) - /// 日志文件路径(可选) - public static void Configure( - LogLevel minLevel = LogLevel.Info, - bool enableConsole = true, - bool useColors = true, - bool enableFile = false, - string? logFilePath = null) - { - var config = new LogConfig - { - DefaultMinLevel = minLevel, - EnableConsole = enableConsole, - UseColors = useColors, - EnableFile = enableFile, - LogFilePath = logFilePath - }; - - Initialize(config); - } - - /// - /// 创建指定类别的日志记录器 - /// - /// 日志类别 - /// 日志记录器实例 - public static ILog CreateLogger(string category) - { - if (_factory != null) - { - return _factory.Create(category); - } - - // 如果没有设置工厂,使用默认配置 - return new ConsoleLogger(category, Config.GetCategoryLevel(category)); - } - - /// - /// 检查指定日志级别是否启用 - /// - /// 要检查的日志级别 - /// 如果指定级别已启用则返回 true,否则返回 false - public static bool IsEnabled(LogLevel level) => Instance.IsEnabled(level); - - /// - /// 记录信息级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public static void Info(string msg, object? ctx = null) - => Instance.Log(LogLevel.Info, msg, null, ctx); - - /// - /// 记录错误级别日志 - /// - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - public static void Error(string msg, Exception? ex = null, object? ctx = null) - => Instance.Log(LogLevel.Error, msg, ex, ctx); - - /// - /// 记录调试级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public static void Debug(string msg, object? ctx = null) - => Instance.Log(LogLevel.Debug, msg, null, ctx); - - /// - /// 记录跟踪级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public static void Trace(string msg, object? ctx = null) - => Instance.Log(LogLevel.Trace, msg, null, ctx); - - /// - /// 记录警告级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public static void Warn(string msg, object? ctx = null) - => Instance.Log(LogLevel.Warning, msg, null, ctx); - - /// - /// 记录致命错误级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public static void Fatal(string msg, object? ctx = null) - => Instance.Log(LogLevel.Fatal, msg, null, ctx); -} diff --git a/GFramework.Core/logging/LogConfig.cs b/GFramework.Core/logging/LogConfig.cs deleted file mode 100644 index e4f28cb..0000000 --- a/GFramework.Core/logging/LogConfig.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace GFramework.Core.logging; - -/// -/// 日志配置类,用于配置日志记录器的行为 -/// -public sealed class LogConfig -{ - /// - /// 获取或设置默认的最小日志级别(默认为Info) - /// - public LogLevel DefaultMinLevel { get; set; } = LogLevel.Info; - - /// - /// 获取或设置是否启用控制台输出(默认为true) - /// - public bool EnableConsole { get; set; } = true; - - /// - /// 获取或设置是否使用彩色输出(默认为true) - /// - public bool UseColors { get; set; } = true; - - /// - /// 获取或设置是否启用文件输出(默认为false) - /// - public bool EnableFile { get; set; } - - /// - /// 获取或设置日志文件路径(当EnableFile为true时使用) - /// - public string? LogFilePath { get; set; } - - /// - /// 取特定类别的日志级别配置 - /// - private readonly Dictionary _categoryLevels = new(); - - /// - /// 设置特定类别的日志级别 - /// - /// 日志类别 - /// 日志级别 - public void SetCategoryLevel(string category, LogLevel level) - { - _categoryLevels[category] = level; - } - - /// - /// 获取类别的日志级别,如果没有特定配置则返回默认级别 - /// - /// 日志类别 - /// 日志级别 - public LogLevel GetCategoryLevel(string? category) - { - if (category != null && _categoryLevels.TryGetValue(category, out var level)) - { - return level; - } - - return DefaultMinLevel; - } - - /// - /// 创建控制台日志记录器 - /// - /// 日志类别 - /// 日志记录器实例 - public ILog CreateConsoleLogger(string? category = null) - { - var level = GetCategoryLevel(category); - return new ConsoleLogger(category, level, null, UseColors); - } - - /// - /// 创建文件日志记录器 - /// - /// 日志类别 - /// 日志记录器实例 - public ILog CreateFileLogger(string? category = null) - { - if (!EnableFile || string.IsNullOrEmpty(LogFilePath)) - return new NullLogger(); - - try - { - var level = GetCategoryLevel(category); - var directory = Path.GetDirectoryName(LogFilePath); - if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - var writer = new StreamWriter(LogFilePath, append: true); - return new ConsoleLogger(category, level, writer, useColors: false); - } - catch - { - // 如果创建文件失败,返回空日志记录器 - return new NullLogger(); - } - } -} \ No newline at end of file diff --git a/GFramework.Core/logging/LoggerFactory.cs b/GFramework.Core/logging/LoggerFactory.cs deleted file mode 100644 index afe12c5..0000000 --- a/GFramework.Core/logging/LoggerFactory.cs +++ /dev/null @@ -1,184 +0,0 @@ -namespace GFramework.Core.logging; - -/// -/// 日志工厂实现,使用LogConfig配置创建日志记录器 -/// -public class LoggerFactory : ILoggerFactory -{ - private readonly LogConfig _config; - private readonly Dictionary _loggers = new(); - - /// - /// 构造函数 - /// - /// 日志配置 - public LoggerFactory(LogConfig config) - { - _config = config ?? throw new ArgumentNullException(nameof(config)); - } - - /// - /// 创建指定类别的日志记录器 - /// - /// 日志类别 - /// 日志记录器实例 - public ILog Create(string category) - { - if (_loggers.TryGetValue(category, out var existingLogger)) - { - return existingLogger; - } - - var logger = CreateLogger(category); - _loggers[category] = logger; - return logger; - } - - /// - /// 创建全局日志记录器实例 - /// - /// 全局日志记录器 - public ILog CreateGlobalLogger() - { - return Create("Global"); - } - /// - /// 创建日志记录器 - /// - /// 日志类别 - /// 日志记录器实例 - private ILog CreateLogger(string category) - { - var level = _config.GetCategoryLevel(category); - var consoleLogger = new ConsoleLogger(category, level, null, _config.UseColors); - - if (_config.EnableFile && !string.IsNullOrEmpty(_config.LogFilePath)) - { - // 创建一个组合日志记录器,同时输出到控制台和文件 - return new CompositeLogger(level, consoleLogger, CreateFileLogger(category)); - } - - return consoleLogger; - } - - /// - /// 创建文件日志记录器 - /// - /// 日志类别 - /// 文件日志记录器实例 - private ILog CreateFileLogger(string category) - { - try - { - var level = _config.GetCategoryLevel(category); - var directory = Path.GetDirectoryName(_config.LogFilePath); - if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - var writer = new StreamWriter(_config.LogFilePath!, append: true); - return new ConsoleLogger(category, level, writer, useColors: false); - } - catch - { - return new NullLogger(); - } - } - - - /// - /// 组合日志记录器,将日志同时输出到多个目标 - /// - /// 最小日志级别,低于此级别的日志将被忽略 - /// 控制台日志记录器 - /// 文件日志记录器 - private sealed class CompositeLogger( - LogLevel minLevel, - ILog consoleLogger, - ILog fileLogger) - : ILog - { - /// - /// 记录日志消息到所有配置的日志目标 - /// - /// 日志级别 - /// 日志消息 - /// 相关异常(可选) - /// 上下文信息(可选) - public void Log( - LogLevel level, - string message, - Exception? exception = null, - object? context = null) - { - if (!IsEnabled(level)) - return; - - consoleLogger.Log(level, message, exception, context); - fileLogger.Log(level, message, exception, context); - } - - /// - /// 检查指定的日志级别是否已启用 - /// - /// 要检查的日志级别 - /// 如果级别已启用则返回true,否则返回false - public bool IsEnabled(LogLevel level) - { - return level >= minLevel; - } - - // 快捷方法 - /// - /// 记录跟踪级别的日志消息 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Trace(string msg, object? ctx = null) - => Log(LogLevel.Trace, msg, null, ctx); - - /// - /// 记录调试级别的日志消息 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Debug(string msg, object? ctx = null) - => Log(LogLevel.Debug, msg, null, ctx); - - /// - /// 记录信息级别的日志消息 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Info(string msg, object? ctx = null) - => Log(LogLevel.Info, msg, null, ctx); - - /// - /// 记录警告级别的日志消息 - /// - /// 日志消息 - /// 上下文信息(可选) - public void Warn(string msg, object? ctx = null) - => Log(LogLevel.Warning, msg, null, ctx); - - /// - /// 记录错误级别的日志消息 - /// - /// 日志消息 - /// 相关异常(可选) - /// 上下文信息(可选) - public void Error(string msg, Exception? ex = null, object? ctx = null) - => Log(LogLevel.Error, msg, ex, ctx); - - /// - /// 记录致命错误级别的日志消息 - /// - /// 日志消息 - /// 相关异常(可选) - /// 上下文信息(可选) - public void Fatal(string msg, Exception? ex = null, object? ctx = null) - => Log(LogLevel.Fatal, msg, ex, ctx); - } - -} \ No newline at end of file diff --git a/GFramework.Core/logging/NoopLogger.cs b/GFramework.Core/logging/NoopLogger.cs new file mode 100644 index 0000000..02295bb --- /dev/null +++ b/GFramework.Core/logging/NoopLogger.cs @@ -0,0 +1,371 @@ +namespace GFramework.Core.logging; + +/// +/// 空操作日志记录器实现,不执行任何实际的日志记录操作 +/// +internal sealed class NoopLogger : ILogger +{ + /// + /// 获取日志记录器的名称 + /// + /// 返回"NOOP"字符串 + public string Name() + { + return "NOOP"; + } + + /// + /// 检查是否启用了跟踪级别日志 + /// + /// 始终返回false + public bool IsTraceEnabled() + { + return false; + } + + /// + /// 检查是否启用了调试级别日志 + /// + /// 始终返回false + public bool IsDebugEnabled() + { + return false; + } + + /// + /// 检查是否启用了信息级别日志 + /// + /// 始终返回false + public bool IsInfoEnabled() + { + return false; + } + + /// + /// 检查是否启用了警告级别日志 + /// + /// 始终返回false + public bool IsWarnEnabled() + { + return false; + } + + /// + /// 检查是否启用了错误级别日志 + /// + /// 始终返回false + public bool IsErrorEnabled() + { + return false; + } + + /// + /// 检查是否启用了致命错误级别日志 + /// + /// 始终返回false + public bool IsFatalEnabled() + { + return false; + } + + + /// + /// 记录跟踪级别日志消息 + /// + /// 要记录的消息 + public void Trace(string msg) + { + + } + + /// + /// 记录跟踪级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Trace(string format, object arg) + { + + } + + /// + /// 记录跟踪级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Trace(string format, object arg1, object arg2) + { + + } + + /// + /// 记录跟踪级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Trace(string format, params object[] arguments) + { + + } + + /// + /// 记录跟踪级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Trace(string msg, Exception t) + { + + } + + /// + /// 记录调试级别日志消息 + /// + /// 要记录的消息 + public void Debug(string msg) + { + + } + + /// + /// 记录调试级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Debug(string format, object arg) + { + + } + + /// + /// 记录调试级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Debug(string format, object arg1, object arg2) + { + + } + + /// + /// 记录调试级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Debug(string format, params object[] arguments) + { + + } + + /// + /// 记录调试级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Debug(string msg, Exception t) + { + + } + + /// + /// 记录信息级别日志消息 + /// + /// 要记录的消息 + public void Info(string msg) + { + + } + + /// + /// 记录信息级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Info(string format, object arg) + { + + } + + /// + /// 记录信息级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Info(string format, object arg1, object arg2) + { + + } + + /// + /// 记录信息级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Info(string format, params object[] arguments) + { + + } + + /// + /// 记录信息级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Info(string msg, Exception t) + { + + } + + /// + /// 记录警告级别日志消息 + /// + /// 要记录的消息 + public void Warn(string msg) + { + + } + + /// + /// 记录警告级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Warn(string format, object arg) + { + + } + + /// + /// 记录警告级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Warn(string format, object arg1, object arg2) + { + + } + + /// + /// 记录警告级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Warn(string format, params object[] arguments) + { + + } + + /// + /// 记录警告级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Warn(string msg, Exception t) + { + + } + + /// + /// 记录错误级别日志消息 + /// + /// 要记录的消息 + public void Error(string msg) + { + + } + + /// + /// 记录错误级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Error(string format, object arg) + { + + } + + /// + /// 记录错误级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Error(string format, object arg1, object arg2) + { + + } + + /// + /// 记录错误级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Error(string format, params object[] arguments) + { + + } + + /// + /// 记录错误级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Error(string msg, Exception t) + { + + } + + /// + /// 记录致命错误级别日志消息 + /// + /// 要记录的消息 + public void Fatal(string msg) + { + + } + + /// + /// 记录致命错误级别日志消息,支持格式化参数 + /// + /// 格式化字符串 + /// 格式化参数 + public void Fatal(string format, object arg) + { + + } + + /// + /// 记录致命错误级别日志消息,支持两个格式化参数 + /// + /// 格式化字符串 + /// 第一个格式化参数 + /// 第二个格式化参数 + public void Fatal(string format, object arg1, object arg2) + { + + } + + /// + /// 记录致命错误级别日志消息,支持多个格式化参数 + /// + /// 格式化字符串 + /// 格式化参数数组 + public void Fatal(string format, params object[] arguments) + { + + } + + /// + /// 记录致命错误级别日志消息和异常信息 + /// + /// 要记录的消息 + /// 要记录的异常 + public void Fatal(string msg, Exception t) + { + + } +} diff --git a/GFramework.Core/logging/NoopLoggerFactory.cs b/GFramework.Core/logging/NoopLoggerFactory.cs new file mode 100644 index 0000000..4119889 --- /dev/null +++ b/GFramework.Core/logging/NoopLoggerFactory.cs @@ -0,0 +1,17 @@ +namespace GFramework.Core.logging; + +/// +/// 无操作日志工厂实现,用于提供空的日志记录功能 +/// +public class NoopLoggerFactory: ILoggerFactory +{ + /// + /// 获取指定名称的无操作日志记录器 + /// + /// 日志记录器的名称 + /// 返回一个NoopLogger实例,该实例不执行任何实际的日志记录操作 + public ILogger GetLogger(string name) + { + return new NoopLogger(); + } +} \ No newline at end of file diff --git a/GFramework.Core/logging/NullLogger.cs b/GFramework.Core/logging/NullLogger.cs deleted file mode 100644 index d57ad69..0000000 --- a/GFramework.Core/logging/NullLogger.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace GFramework.Core.logging; - -/// -/// 空日志记录器实现,用于禁用日志记录功能 -/// -internal sealed class NullLogger : ILog -{ - /// - /// 记录日志消息(空实现,不执行任何操作) - /// - /// 日志级别 - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - public void Log(LogLevel level, string message, Exception? exception, object? context) { } - - /// - /// 检查指定日志级别是否启用 - /// - /// 要检查的日志级别 - /// 始终返回 false,表示所有日志级别都被禁用 - public bool IsEnabled(LogLevel level) => false; - - /// - /// 记录信息级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public void Info(string msg, object? ctx = null) { } - - /// - /// 记录错误级别日志 - /// - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - public void Error(string msg, Exception? ex = null, object? ctx = null) { } - - /// - /// 记录调试级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public void Debug(string msg, object? ctx = null) { } - - /// - /// 记录跟踪级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public void Trace(string msg, object? ctx = null) { } - - /// - /// 记录警告级别日志 - /// - /// 日志消息 - /// 日志上下文信息(可选) - public void Warn(string msg, object? ctx = null) { } - - /// - /// 记录致命错误级别日志 - /// - /// 日志消息 - /// 相关异常对象(可选) - /// 日志上下文信息(可选) - public void Fatal(string msg,Exception? ex = null, object? ctx = null) { } -} diff --git a/GFramework.Core/model/ICanGetModel.cs b/GFramework.Core/model/ICanGetModel.cs deleted file mode 100644 index 5f1215c..0000000 --- a/GFramework.Core/model/ICanGetModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.model; - -/// -/// 定义一个接口,表示可以获取模型的架构组件。 -/// 该接口继承自IBelongToArchitecture,表明实现此接口的类型属于特定架构。 -/// -public interface ICanGetModel : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/model/IModel.cs b/GFramework.Core/model/IModel.cs index fdde852..045d23c 100644 --- a/GFramework.Core/model/IModel.cs +++ b/GFramework.Core/model/IModel.cs @@ -7,7 +7,7 @@ namespace GFramework.Core.model; /// /// 模型接口,定义了模型的基本行为和功能 /// -public interface IModel : ICanSetArchitecture, ICanGetUtility, ICanSendEvent +public interface IModel { /// /// 初始化模型 diff --git a/GFramework.Core/query/ICanSendQuery.cs b/GFramework.Core/query/ICanSendQuery.cs deleted file mode 100644 index 947c887..0000000 --- a/GFramework.Core/query/ICanSendQuery.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.query; - -/// -/// 定义一个可以发送查询的接口契约 -/// 该接口继承自IBelongToArchitecture,表示实现此接口的类型属于某个架构组件 -/// -public interface ICanSendQuery : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/query/IQuery.cs b/GFramework.Core/query/IQuery.cs index f99ec0e..6ab3dec 100644 --- a/GFramework.Core/query/IQuery.cs +++ b/GFramework.Core/query/IQuery.cs @@ -8,8 +8,7 @@ namespace GFramework.Core.query; /// 查询接口,定义了执行查询操作的契约 /// /// 查询结果的类型 -public interface IQuery : ICanSetArchitecture, ICanGetModel, ICanGetSystem, - ICanSendQuery +public interface IQuery { /// /// 执行查询操作并返回结果 diff --git a/GFramework.Core/rule/ContextAwareBase.cs b/GFramework.Core/rule/ContextAwareBase.cs new file mode 100644 index 0000000..cd76290 --- /dev/null +++ b/GFramework.Core/rule/ContextAwareBase.cs @@ -0,0 +1,29 @@ +using GFramework.Core.architecture; + +namespace GFramework.Core.rule; + +/// +/// 上下文感知基类,实现了IContextAware接口,为需要感知架构上下文的类提供基础实现 +/// +public abstract class ContextAwareBase : IContextAware +{ + /// + /// 获取当前实例的架构上下文 + /// + protected IArchitectureContext Context { get; private set; } = null!; + + /// + /// 设置架构上下文的实现方法,由框架调用 + /// + /// 要设置的架构上下文实例 + void IContextAware.SetContext(IArchitectureContext context) + { + Context = context; + OnContextReady(); + } + + /// + /// 当上下文准备就绪时调用的虚方法,子类可以重写此方法来执行上下文相关的初始化逻辑 + /// + protected virtual void OnContextReady() { } +} diff --git a/GFramework.Core/rule/IBelongToArchitecture.cs b/GFramework.Core/rule/IBelongToArchitecture.cs deleted file mode 100644 index eb98da4..0000000 --- a/GFramework.Core/rule/IBelongToArchitecture.cs +++ /dev/null @@ -1,16 +0,0 @@ -using GFramework.Core.architecture; - -namespace GFramework.Core.rule; - -/// -/// 定义一个接口,用于标识某个对象属于特定的架构体系。 -/// 实现此接口的对象可以通过GetArchitecture方法获取其所属的架构实例。 -/// -public interface IBelongToArchitecture -{ - /// - /// 获取当前对象所属的架构实例。 - /// - /// 返回实现IArchitecture接口的架构实例 - IArchitecture GetArchitecture(); -} \ No newline at end of file diff --git a/GFramework.Core/rule/ICanSetArchitecture.cs b/GFramework.Core/rule/ICanSetArchitecture.cs deleted file mode 100644 index 9fdfd66..0000000 --- a/GFramework.Core/rule/ICanSetArchitecture.cs +++ /dev/null @@ -1,15 +0,0 @@ -using GFramework.Core.architecture; - -namespace GFramework.Core.rule; - -/// -/// 定义一个接口,用于设置架构实例 -/// -public interface ICanSetArchitecture -{ - /// - /// 设置架构实例 - /// - /// 要设置的架构实例 - void SetArchitecture(IArchitecture architecture); -} \ No newline at end of file diff --git a/GFramework.Core/rule/IContextAware.cs b/GFramework.Core/rule/IContextAware.cs new file mode 100644 index 0000000..c6319e6 --- /dev/null +++ b/GFramework.Core/rule/IContextAware.cs @@ -0,0 +1,15 @@ +using GFramework.Core.architecture; + +namespace GFramework.Core.rule; + +/// +/// 上下文感知接口,用于为实现该接口的类提供设置架构上下文的能力 +/// +public interface IContextAware +{ + /// + /// 设置架构上下文 + /// + /// 架构上下文对象,用于提供架构级别的服务和功能访问 + void SetContext(IArchitectureContext context); +} diff --git a/GFramework.Core/system/AbstractSystem.cs b/GFramework.Core/system/AbstractSystem.cs index 8afa3ef..2fef273 100644 --- a/GFramework.Core/system/AbstractSystem.cs +++ b/GFramework.Core/system/AbstractSystem.cs @@ -8,39 +8,21 @@ namespace GFramework.Core.system; /// 抽象系统基类,实现系统接口的基本功能 /// 提供架构关联、初始化和销毁机制 /// -public abstract class AbstractSystem : ISystem +public abstract class AbstractSystem : ContextAwareBase, ISystem { - private IArchitecture _mArchitecture; - - /// - /// 获取当前系统所属的架构实例 - /// - /// 返回系统关联的架构对象 - IArchitecture IBelongToArchitecture.GetArchitecture() - { - return _mArchitecture; - } - - /// - /// 设置系统所属的架构实例 - /// - /// 要关联的架构对象 - void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) - { - _mArchitecture = architecture; - } + private ILogger _logger = null!; /// /// 系统初始化方法,调用抽象初始化方法 /// void ISystem.Init() { - var logger = Log.CreateLogger("System"); - logger.Debug($"Initializing system: {GetType().Name}"); - + _logger = Context.Logger; + _logger.Debug($"Initializing system: {GetType().Name}"); + OnInit(); - - logger.Info($"System initialized: {GetType().Name}"); + + _logger.Info($"System initialized: {GetType().Name}"); } /// @@ -48,21 +30,22 @@ public abstract class AbstractSystem : ISystem /// void ISystem.Destroy() { - var logger = Log.CreateLogger("System"); - logger.Debug($"Destroying system: {GetType().Name}"); - + _logger.Debug($"Destroying system: {GetType().Name}"); + OnDestroy(); - - logger.Info($"System destroyed: {GetType().Name}"); + + _logger.Info($"System destroyed: {GetType().Name}"); } /// /// 抽象初始化方法,由子类实现具体的初始化逻辑 /// protected abstract void OnInit(); - + /// /// 抽象销毁方法,由子类实现具体的资源清理逻辑 /// - protected virtual void OnDestroy() { } + protected virtual void OnDestroy() + { + } } \ No newline at end of file diff --git a/GFramework.Core/system/ICanGetSystem.cs b/GFramework.Core/system/ICanGetSystem.cs deleted file mode 100644 index ecbf630..0000000 --- a/GFramework.Core/system/ICanGetSystem.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.system; - -/// -/// 定义一个接口,表示可以获取系统的对象。 -/// 该接口继承自IBelongToArchitecture接口,用于标识那些属于系统架构并能够获取系统实例的类型。 -/// -public interface ICanGetSystem : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Core/system/ISystem.cs b/GFramework.Core/system/ISystem.cs index c8c031f..739fd5e 100644 --- a/GFramework.Core/system/ISystem.cs +++ b/GFramework.Core/system/ISystem.cs @@ -1,7 +1,4 @@ -using GFramework.Core.events; -using GFramework.Core.model; using GFramework.Core.rule; -using GFramework.Core.utility; namespace GFramework.Core.system; @@ -9,8 +6,7 @@ namespace GFramework.Core.system; /// 系统接口,定义了系统的基本行为和功能 /// 该接口继承了多个框架相关的接口,提供了系统初始化和销毁能力 /// -public interface ISystem : ICanSetArchitecture, ICanGetModel, ICanGetUtility, - ICanRegisterEvent, ICanSendEvent, ICanGetSystem +public interface ISystem : IContextAware { /// /// 初始化系统 diff --git a/GFramework.Core/utility/ICanGetUtility.cs b/GFramework.Core/utility/ICanGetUtility.cs deleted file mode 100644 index 4bb7771..0000000 --- a/GFramework.Core/utility/ICanGetUtility.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GFramework.Core.rule; - -namespace GFramework.Core.utility; - -/// -/// 定义一个接口,表示可以获取工具类的对象 -/// 该接口继承自IBelongToArchitecture,表明实现此接口的类型属于某个架构组件 -/// -public interface ICanGetUtility : IBelongToArchitecture; \ No newline at end of file diff --git a/GFramework.Game/GFramework.Game.csproj b/GFramework.Game/GFramework.Game.csproj index 6faca1d..8e4d4d0 100644 --- a/GFramework.Game/GFramework.Game.csproj +++ b/GFramework.Game/GFramework.Game.csproj @@ -9,6 +9,7 @@ + diff --git a/GFramework.Godot/logging/GodotLogProvider.cs b/GFramework.Godot/logging/GodotLogProvider.cs new file mode 100644 index 0000000..312d5ef --- /dev/null +++ b/GFramework.Godot/logging/GodotLogProvider.cs @@ -0,0 +1,17 @@ +using GFramework.Core.logging; + +namespace GFramework.Godot.logging; + +/// +/// Godot日志提供程序,实现ILogProvider接口,用于创建GodotLogger实例 +/// +public sealed class GodotLogProvider : ILogProvider +{ + /// + /// 创建指定类别的日志记录器 + /// + /// 日志类别名称 + /// 返回GodotLogger实例 + public ILogger CreateLogger(string category) + => new GodotLogger(category); +} diff --git a/GFramework.Godot/logging/GodotLogger.cs b/GFramework.Godot/logging/GodotLogger.cs index ed1901c..8f2605b 100644 --- a/GFramework.Godot/logging/GodotLogger.cs +++ b/GFramework.Godot/logging/GodotLogger.cs @@ -6,8 +6,11 @@ namespace GFramework.Godot.logging; /// /// Godot平台的日志记录器实现 /// -public sealed class GodotLogger : ILog +public sealed class GodotLogger : ILogger { + private readonly string _category; + + public GodotLogger(string category) => _category = category; /// /// 记录日志消息到Godot控制台 ///