From 2f5af5c067aa639a0cf5d310b624b064279b4dfb Mon Sep 17 00:00:00 2001
From: GwWuYou <95328647+GeWuYou@users.noreply.github.com>
Date: Thu, 1 Jan 2026 22:13:06 +0800
Subject: [PATCH] =?UTF-8?q?refactor(architecture):=20=E7=A7=BB=E9=99=A4?=
=?UTF-8?q?=E6=9E=B6=E6=9E=84=E4=B8=8A=E4=B8=8B=E6=96=87=E4=B8=AD=E7=9A=84?=
=?UTF-8?q?=E6=97=A5=E5=BF=97=E5=B1=9E=E6=80=A7=E4=BE=9D=E8=B5=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 从 ArchitectureContext 构造函数中移除 LoggerProperties 参数
- 更新 Architecture 类中上下文初始化逻辑,不再传递日志属性
- 优化事件系统中的空值安全处理
- 修正 EasyEvent 泛型类中的类型参数命名
- 移除不再需要的 IsExternalInit 内部实现
- 更新包引用配置添加 PrivateAssets 属性
---
GFramework.Core/architecture/Architecture.cs | 4 +-
.../architecture/ArchitectureContext.cs | 4 +-
GFramework.Core/events/DefaultUnRegister.cs | 4 +-
GFramework.Core/events/EasyEvent.cs | 2 +-
GFramework.Core/events/EasyEventGeneric.cs | 79 ++-----------------
GFramework.Core/events/EasyEvents.cs | 2 +-
GFramework.Core/events/OrEvent.cs | 4 +-
GFramework.Core/events/UnRegisterList.cs | 2 +-
GFramework.Core/model/AbstractModel.cs | 2 +-
.../property/BindablePropertyUnRegister.cs | 13 ++-
.../assets/AssetCatalog.cs | 8 +-
.../internals/IsExternalInit.cs | 12 +++
GFramework.Godot/GFramework.Godot.csproj | 4 +-
.../AnalyzerReleases.Unshipped.md | 7 +-
14 files changed, 47 insertions(+), 100 deletions(-)
create mode 100644 GFramework.Game.Abstractions/internals/IsExternalInit.cs
diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs
index e540040..2ace215 100644
--- a/GFramework.Core/architecture/Architecture.cs
+++ b/GFramework.Core/architecture/Architecture.cs
@@ -233,7 +233,7 @@ public abstract class Architecture(
// 设置日志工厂提供程序,用于创建日志记录器
LoggerFactoryResolver.Provider = Configuration.LoggerProperties.LoggerFactoryProvider;
_logger = LoggerFactoryResolver.Provider.CreateLogger(GetType().Name);
- _context ??= new ArchitectureContext(Container, TypeEventSystem, Configuration.LoggerProperties);
+ _context ??= new ArchitectureContext(Container, TypeEventSystem);
GameContext.Bind(GetType(), _context);
// 创建架构运行时实例
Runtime = new ArchitectureRuntime(_context);
@@ -289,7 +289,7 @@ public abstract class Architecture(
LoggerFactoryResolver.Provider = Configuration.LoggerProperties.LoggerFactoryProvider;
// 创建日志记录器
_logger = LoggerFactoryResolver.Provider.CreateLogger(GetType().Name);
- _context ??= new ArchitectureContext(Container, TypeEventSystem, Configuration.LoggerProperties);
+ _context ??= new ArchitectureContext(Container, TypeEventSystem);
GameContext.Bind(GetType(), _context);
// 创建架构运行时实例
Runtime = new ArchitectureRuntime(_context);
diff --git a/GFramework.Core/architecture/ArchitectureContext.cs b/GFramework.Core/architecture/ArchitectureContext.cs
index afd7274..191b456 100644
--- a/GFramework.Core/architecture/ArchitectureContext.cs
+++ b/GFramework.Core/architecture/ArchitectureContext.cs
@@ -3,7 +3,6 @@ using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.ioc;
using GFramework.Core.Abstractions.model;
-using GFramework.Core.Abstractions.properties;
using GFramework.Core.Abstractions.query;
using GFramework.Core.Abstractions.system;
using GFramework.Core.Abstractions.utility;
@@ -15,8 +14,7 @@ namespace GFramework.Core.architecture;
///
public class ArchitectureContext(
IIocContainer container,
- ITypeEventSystem typeEventSystem,
- LoggerProperties loggerProperties)
+ ITypeEventSystem typeEventSystem)
: IArchitectureContext
{
private readonly IIocContainer _container = container ?? throw new ArgumentNullException(nameof(container));
diff --git a/GFramework.Core/events/DefaultUnRegister.cs b/GFramework.Core/events/DefaultUnRegister.cs
index ddc624b..79ea0b5 100644
--- a/GFramework.Core/events/DefaultUnRegister.cs
+++ b/GFramework.Core/events/DefaultUnRegister.cs
@@ -8,7 +8,7 @@ namespace GFramework.Core.events;
/// 注销时要执行的回调函数
public class DefaultUnRegister(Action onUnRegister) : IUnRegister
{
- private Action _mOnUnRegister = onUnRegister;
+ private Action? _mOnUnRegister = onUnRegister;
///
/// 执行注销操作,调用注册的回调函数并清理引用
@@ -16,7 +16,7 @@ public class DefaultUnRegister(Action onUnRegister) : IUnRegister
public void UnRegister()
{
// 调用注销回调函数并清理引用
- _mOnUnRegister.Invoke();
+ _mOnUnRegister?.Invoke();
_mOnUnRegister = null;
}
}
\ No newline at end of file
diff --git a/GFramework.Core/events/EasyEvent.cs b/GFramework.Core/events/EasyEvent.cs
index 5e4d3cf..d0b2625 100644
--- a/GFramework.Core/events/EasyEvent.cs
+++ b/GFramework.Core/events/EasyEvent.cs
@@ -7,7 +7,7 @@ namespace GFramework.Core.events;
///
public class EasyEvent
{
- private Action _mOnEvent = () => { };
+ private Action? _mOnEvent = () => { };
///
/// 注册事件回调函数
diff --git a/GFramework.Core/events/EasyEventGeneric.cs b/GFramework.Core/events/EasyEventGeneric.cs
index 1cce0d6..4a77dd2 100644
--- a/GFramework.Core/events/EasyEventGeneric.cs
+++ b/GFramework.Core/events/EasyEventGeneric.cs
@@ -13,7 +13,7 @@ public class EasyEvent : IEasyEvent
/// 存储已注册的事件处理委托。
/// 默认为空操作(no-op)委托,避免 null 检查。
///
- private Action _mOnEvent = e => { };
+ private Action? _mOnEvent = _ => { };
///
/// 显式实现 IEasyEvent 接口中的 Register 方法。
@@ -66,14 +66,14 @@ public class EasyEvent : IEasyEvent
/// 提供事件注册、注销和触发功能。
///
/// 第一个参数类型。
-/// 第二个参数类型。
-public class EasyEvent : IEasyEvent
+/// 第二个参数类型。
+public class EasyEvent : IEasyEvent
{
///
/// 存储已注册的双参数事件处理委托。
/// 默认为空操作(no-op)委托。
///
- private Action _mOnEvent = (_, _) => { };
+ private Action? _mOnEvent = (_, _) => { };
///
/// 显式实现 IEasyEvent 接口中的 Register 方法。
@@ -85,7 +85,7 @@ public class EasyEvent : IEasyEvent
{
return Register(Action);
- void Action(T _, TK __)
+ void Action(T _, Tk __)
{
onEvent();
}
@@ -96,7 +96,7 @@ public class EasyEvent : IEasyEvent
///
/// 要注册的事件处理方法。
/// IUnRegister 对象,用于稍后注销该事件监听器。
- public IUnRegister Register(Action onEvent)
+ public IUnRegister Register(Action onEvent)
{
_mOnEvent += onEvent;
return new DefaultUnRegister(() => { UnRegister(onEvent); });
@@ -106,7 +106,7 @@ public class EasyEvent : IEasyEvent
/// 取消指定的双参数事件监听器。
///
/// 需要被注销的事件处理方法。
- public void UnRegister(Action onEvent)
+ public void UnRegister(Action onEvent)
{
_mOnEvent -= onEvent;
}
@@ -116,71 +116,8 @@ public class EasyEvent : IEasyEvent
///
/// 第一个参数。
/// 第二个参数。
- public void Trigger(T t, TK k)
+ public void Trigger(T t, Tk k)
{
_mOnEvent?.Invoke(t, k);
}
-}
-
-///
-/// 支持三个泛型参数 T、TK 和 TS 的事件类。
-/// 提供事件注册、注销和触发功能。
-///
-/// 第一个参数类型。
-/// 第二个参数类型。
-/// 第三个参数类型。
-public class EasyEvent : IEasyEvent
-{
- ///
- /// 存储已注册的三参数事件处理委托。
- /// 默认为空操作(no-op)委托。
- ///
- private Action _mOnEvent = (_, _, _) => { };
-
- ///
- /// 显式实现 IEasyEvent 接口中的 Register 方法。
- /// 允许使用无参 Action 来订阅当前带参事件。
- ///
- /// 无参事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
- IUnRegister IEasyEvent.Register(Action onEvent)
- {
- return Register(Action);
-
- void Action(T _, TK __, TS ___)
- {
- onEvent();
- }
- }
-
- ///
- /// 注册一个接受三个参数的事件监听器,并返回可用于取消注册的对象。
- ///
- /// 要注册的事件处理方法。
- /// IUnRegister 对象,用于稍后注销该事件监听器。
- public IUnRegister Register(Action onEvent)
- {
- _mOnEvent += onEvent;
- return new DefaultUnRegister(() => { UnRegister(onEvent); });
- }
-
- ///
- /// 取消指定的三参数事件监听器。
- ///
- /// 需要被注销的事件处理方法。
- public void UnRegister(Action onEvent)
- {
- _mOnEvent -= onEvent;
- }
-
- ///
- /// 触发所有已注册的事件处理程序,并传递参数 t、k 和 s。
- ///
- /// 第一个参数。
- /// 第二个参数。
- /// 第三个参数。
- public void Trigger(T t, TK k, TS s)
- {
- _mOnEvent?.Invoke(t, k, s);
- }
}
\ No newline at end of file
diff --git a/GFramework.Core/events/EasyEvents.cs b/GFramework.Core/events/EasyEvents.cs
index d8b84ce..19c03e7 100644
--- a/GFramework.Core/events/EasyEvents.cs
+++ b/GFramework.Core/events/EasyEvents.cs
@@ -53,7 +53,7 @@ public class EasyEvents
/// 指定类型的事件实例,如果不存在则返回默认值
public T GetEvent() where T : IEasyEvent
{
- return _mTypeEvents.TryGetValue(typeof(T), out var e) ? (T)e : default;
+ return _mTypeEvents.TryGetValue(typeof(T), out var e) ? (T)e : default!;
}
///
diff --git a/GFramework.Core/events/OrEvent.cs b/GFramework.Core/events/OrEvent.cs
index 8c5f34e..896cf26 100644
--- a/GFramework.Core/events/OrEvent.cs
+++ b/GFramework.Core/events/OrEvent.cs
@@ -8,12 +8,12 @@ namespace GFramework.Core.events;
///
public class OrEvent : IUnRegisterList
{
- private Action _mOnEvent = () => { };
+ private Action? _mOnEvent = () => { };
///
/// 获取取消注册列表
///
- public IList UnregisterList { get; }
+ public IList UnregisterList { get; } = new List();
///
/// 将指定的事件与当前OrEvent进行或逻辑组合
diff --git a/GFramework.Core/events/UnRegisterList.cs b/GFramework.Core/events/UnRegisterList.cs
index 3f413c3..8eb29d9 100644
--- a/GFramework.Core/events/UnRegisterList.cs
+++ b/GFramework.Core/events/UnRegisterList.cs
@@ -12,7 +12,7 @@ public class UnRegisterList : IUnRegisterList
///
/// 获取取消注册列表的只读属性
///
- public IList UnregisterList { get; }
+ public IList UnregisterList { get; } = null!;
///
/// 向取消注册列表中添加一个新的可取消注册对象
diff --git a/GFramework.Core/model/AbstractModel.cs b/GFramework.Core/model/AbstractModel.cs
index 8b0e4fb..aae101c 100644
--- a/GFramework.Core/model/AbstractModel.cs
+++ b/GFramework.Core/model/AbstractModel.cs
@@ -12,7 +12,7 @@ public abstract class AbstractModel : IModel
///
/// 模型所属的架构实例
///
- protected IArchitectureContext _context { get; private set; }
+ protected IArchitectureContext _context { get; private set; } = null!;
///
/// 初始化模型,调用抽象方法OnInit执行具体初始化逻辑
diff --git a/GFramework.Core/property/BindablePropertyUnRegister.cs b/GFramework.Core/property/BindablePropertyUnRegister.cs
index 28a1fa0..2cbd06e 100644
--- a/GFramework.Core/property/BindablePropertyUnRegister.cs
+++ b/GFramework.Core/property/BindablePropertyUnRegister.cs
@@ -14,20 +14,25 @@ public class BindablePropertyUnRegister(BindableProperty bindableProperty,
///
/// 获取或设置可绑定属性实例
///
- public BindableProperty BindableProperty { get; set; } = bindableProperty;
+ public BindableProperty? BindableProperty { get; set; } = bindableProperty;
///
/// 获取或设置值变化时的回调函数
///
- public Action OnValueChanged { get; set; } = onValueChanged;
+ public Action? OnValueChanged { get; set; } = onValueChanged;
///
/// 执行注销操作,取消注册值变化监听并清理引用
///
public void UnRegister()
{
- // 调用可绑定属性的注销方法,传入值变化回调函数
- BindableProperty.UnRegister(OnValueChanged);
+ // 检查两个引用都不为null时才执行注销操作
+ if (BindableProperty != null && OnValueChanged != null)
+ {
+ // 调用可绑定属性的注销方法,传入值变化回调函数
+ BindableProperty.UnRegister(OnValueChanged);
+ }
+
// 清理属性引用
BindableProperty = null;
// 清理回调函数引用
diff --git a/GFramework.Game.Abstractions/assets/AssetCatalog.cs b/GFramework.Game.Abstractions/assets/AssetCatalog.cs
index 3425829..9d89ee5 100644
--- a/GFramework.Game.Abstractions/assets/AssetCatalog.cs
+++ b/GFramework.Game.Abstractions/assets/AssetCatalog.cs
@@ -1,10 +1,4 @@
-namespace System.Runtime.CompilerServices
-{
- // 这个类用于支持C# 9.0中的init访问器和记录类型功能
- internal static class IsExternalInit;
-}
-
-namespace GFramework.Game.Abstractions.assets
+namespace GFramework.Game.Abstractions.assets
{
///
/// 资源目录类,用于定义和管理游戏中的场景和资源标识符
diff --git a/GFramework.Game.Abstractions/internals/IsExternalInit.cs b/GFramework.Game.Abstractions/internals/IsExternalInit.cs
new file mode 100644
index 0000000..2d050dd
--- /dev/null
+++ b/GFramework.Game.Abstractions/internals/IsExternalInit.cs
@@ -0,0 +1,12 @@
+// IsExternalInit.cs
+// This type is required to support init-only setters and record types
+// when targeting netstandard2.0 or older frameworks.
+
+#pragma warning disable S2094 // Remove this empty class
+namespace System.Runtime.CompilerServices
+{
+ internal static class IsExternalInit
+ {
+ }
+}
+#pragma warning restore S2094
\ No newline at end of file
diff --git a/GFramework.Godot/GFramework.Godot.csproj b/GFramework.Godot/GFramework.Godot.csproj
index b186170..3a0e22a 100644
--- a/GFramework.Godot/GFramework.Godot.csproj
+++ b/GFramework.Godot/GFramework.Godot.csproj
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/GFramework.SourceGenerators/AnalyzerReleases.Unshipped.md b/GFramework.SourceGenerators/AnalyzerReleases.Unshipped.md
index 76924ff..4cf23a9 100644
--- a/GFramework.SourceGenerators/AnalyzerReleases.Unshipped.md
+++ b/GFramework.SourceGenerators/AnalyzerReleases.Unshipped.md
@@ -3,6 +3,7 @@
### New Rules
- Rule ID | Category | Severity | Notes
--------------|----------------------------------|----------|------------------------
- GF_Rule_001 | GFramework.SourceGenerators.rule | Error | ContextAwareDiagnostic
\ No newline at end of file
+ Rule ID | Category | Severity | Notes
+----------------|----------------------------------|----------|------------------------
+ GF_Logging_001 | GFramework.Godot.logging | Warning | LoggerDiagnostics
+ GF_Rule_001 | GFramework.SourceGenerators.rule | Error | ContextAwareDiagnostic
\ No newline at end of file