From f8c39e46a54da02e64b745612174013f354e0f31 Mon Sep 17 00:00:00 2001
From: GeWuYou <95328647+GeWuYou@users.noreply.github.com>
Date: Thu, 5 Mar 2026 21:29:45 +0800
Subject: [PATCH] =?UTF-8?q?feat(architecture):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=8C=89=E4=BC=98=E5=85=88=E7=BA=A7=E8=8E=B7=E5=8F=96=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=AE=9E=E4=BE=8B=E7=9A=84=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在 ArchitectureContext 中添加 GetServicesByPriority、GetSystemsByPriority、
GetModelsByPriority 和 GetUtilitiesByPriority 方法
- 在 ContextAwareServiceExtensions 中添加对应的扩展方法支持按优先级获取实例
- 在 MicrosoftDiContainer 中实现 GetAllByPriority 方法和 SortByPriority 排序逻辑
- 在抽象层定义 IPrioritized 接口用于标记可排序的服务组件
- 为 PauseToken 添加完整的相等性比较和字符串转换方法
- 添加全面的单元测试验证优先级排序功能的正确性
---
.../architecture/IArchitectureContext.cs | 32 +++
.../bases/IPrioritized.cs | 17 ++
.../ioc/IIocContainer.cs | 18 ++
.../pause/PauseToken.cs | 33 ++-
.../architecture/ArchitectureServicesTests.cs | 20 ++
.../architecture/GameContextTests.cs | 20 ++
.../architecture/PriorityServiceTests.cs | 249 ++++++++++++++++++
.../ioc/MicrosoftDiContainerTests.cs | 228 ++++++++++++++++
.../architecture/ArchitectureContext.cs | 44 ++++
.../ContextAwareServiceExtensions.cs | 60 +++++
GFramework.Core/ioc/MicrosoftDiContainer.cs | 51 ++++
11 files changed, 771 insertions(+), 1 deletion(-)
create mode 100644 GFramework.Core.Abstractions/bases/IPrioritized.cs
create mode 100644 GFramework.Core.Tests/architecture/PriorityServiceTests.cs
diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs
index c0d5d05..0558b0d 100644
--- a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs
+++ b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs
@@ -71,6 +71,38 @@ public interface IArchitectureContext
/// 所有符合条件的工具类实例列表
IReadOnlyList GetUtilities() where TUtility : class, IUtility;
+ ///
+ /// 获取指定类型的所有服务实例,并按优先级排序
+ /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高)
+ ///
+ /// 服务类型
+ /// 按优先级排序后的服务实例列表
+ IReadOnlyList GetServicesByPriority() where TService : class;
+
+ ///
+ /// 获取指定类型的所有系统实例,并按优先级排序
+ /// 实现 IPrioritized 接口的系统将按优先级排序(数值越小优先级越高)
+ ///
+ /// 系统类型,必须继承自ISystem接口
+ /// 按优先级排序后的系统实例列表
+ IReadOnlyList GetSystemsByPriority() where TSystem : class, ISystem;
+
+ ///
+ /// 获取指定类型的所有模型实例,并按优先级排序
+ /// 实现 IPrioritized 接口的模型将按优先级排序(数值越小优先级越高)
+ ///
+ /// 模型类型,必须继承自IModel接口
+ /// 按优先级排序后的模型实例列表
+ IReadOnlyList GetModelsByPriority() where TModel : class, IModel;
+
+ ///
+ /// 获取指定类型的所有工具类实例,并按优先级排序
+ /// 实现 IPrioritized 接口的工具将按优先级排序(数值越小优先级越高)
+ ///
+ /// 工具类类型,必须继承自IUtility接口
+ /// 按优先级排序后的工具类实例列表
+ IReadOnlyList GetUtilitiesByPriority() where TUtility : class, IUtility;
+
///
/// 发送一个命令
///
diff --git a/GFramework.Core.Abstractions/bases/IPrioritized.cs b/GFramework.Core.Abstractions/bases/IPrioritized.cs
new file mode 100644
index 0000000..be0c5a7
--- /dev/null
+++ b/GFramework.Core.Abstractions/bases/IPrioritized.cs
@@ -0,0 +1,17 @@
+namespace GFramework.Core.Abstractions.bases;
+
+///
+/// 定义具有优先级的对象接口。
+/// 数值越小优先级越高,越先执行。
+/// 用于控制服务、系统等组件的执行顺序。
+///
+public interface IPrioritized
+{
+ ///
+ /// 获取优先级值。
+ /// 数值越小优先级越高。
+ /// 默认优先级为 0。
+ /// 建议范围:-1000 到 1000。
+ ///
+ int Priority { get; }
+}
\ No newline at end of file
diff --git a/GFramework.Core.Abstractions/ioc/IIocContainer.cs b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
index 9a07c8d..8e87a2a 100644
--- a/GFramework.Core.Abstractions/ioc/IIocContainer.cs
+++ b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
@@ -165,6 +165,24 @@ public interface IIocContainer : IContextAware
/// 按指定方式排序后的实例列表
IReadOnlyList GetAllSorted(Comparison comparison) where T : class;
+ ///
+ /// 获取指定类型的所有实例,并按优先级排序
+ /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高)
+ /// 未实现 IPrioritized 的服务将使用默认优先级 0
+ ///
+ /// 期望获取的实例类型
+ /// 按优先级排序后的实例列表
+ IReadOnlyList GetAllByPriority() where T : class;
+
+ ///
+ /// 获取指定类型的所有实例,并按优先级排序
+ /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高)
+ /// 未实现 IPrioritized 的服务将使用默认优先级 0
+ ///
+ /// 期望获取的实例类型
+ /// 按优先级排序后的实例列表
+ IReadOnlyList