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控制台
///