diff --git a/GFramework.Core.Abstractions/architecture/IServiceModule.cs b/GFramework.Core.Abstractions/architecture/IServiceModule.cs
new file mode 100644
index 0000000..950bdd2
--- /dev/null
+++ b/GFramework.Core.Abstractions/architecture/IServiceModule.cs
@@ -0,0 +1,34 @@
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.Abstractions.lifecycle;
+
+namespace GFramework.Core.Abstractions.architecture;
+
+///
+/// 服务模块接口,定义了服务模块的基本契约。
+/// 所有服务模块必须实现此接口,以支持注册、初始化和异步销毁功能。
+///
+public interface IServiceModule : IInitializable, IAsyncDestroyable
+{
+ ///
+ /// 获取模块的唯一名称。
+ ///
+ string ModuleName { get; }
+
+ ///
+ /// 获取模块的优先级,数值越小优先级越高。
+ /// 用于控制模块的注册和初始化顺序。
+ ///
+ int Priority { get; }
+
+ ///
+ /// 获取模块的启用状态。
+ /// 返回 true 表示模块已启用,false 表示模块被禁用。
+ ///
+ bool IsEnabled { get; }
+
+ ///
+ /// 注册模块提供的服务到依赖注入容器中。
+ ///
+ /// 依赖注入容器实例,用于注册服务。
+ void Register(IIocContainer container);
+}
\ No newline at end of file
diff --git a/GFramework.Core.Abstractions/architecture/IServiceModuleManager.cs b/GFramework.Core.Abstractions/architecture/IServiceModuleManager.cs
new file mode 100644
index 0000000..b86b26e
--- /dev/null
+++ b/GFramework.Core.Abstractions/architecture/IServiceModuleManager.cs
@@ -0,0 +1,17 @@
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.Abstractions.properties;
+
+namespace GFramework.Core.Abstractions.architecture;
+
+public interface IServiceModuleManager
+{
+ void RegisterModule(IServiceModule module);
+
+ void RegisterBuiltInModules(IIocContainer container, ArchitectureProperties properties);
+
+ IReadOnlyList GetModules();
+
+ Task InitializeAllAsync(bool asyncMode);
+
+ ValueTask DestroyAllAsync();
+}
\ No newline at end of file
diff --git a/GFramework.Core.Abstractions/properties/ArchitectureProperties.cs b/GFramework.Core.Abstractions/properties/ArchitectureProperties.cs
index 6895d4a..1915685 100644
--- a/GFramework.Core.Abstractions/properties/ArchitectureProperties.cs
+++ b/GFramework.Core.Abstractions/properties/ArchitectureProperties.cs
@@ -1,17 +1,26 @@
-namespace GFramework.Core.Abstractions.properties;
+namespace GFramework.Core.Abstractions.properties;
///
-/// 架构选项配置类,用于定义架构行为的相关配置选项
+/// 架构选项配置类,用于定义架构行为的相关配置选项。
+/// 通过该类可以控制架构的初始化行为和运行时特性。
///
public sealed class ArchitectureProperties
{
///
- /// 允许延迟注册开关,当设置为true时允许在初始化完成后进行组件注册
+ /// 允许延迟注册开关,当设置为 true 时允许在初始化完成后进行组件注册。
+ /// 默认值为 false,表示不允许延迟注册。
///
public bool AllowLateRegistration { get; set; }
///
- /// 严格阶段验证开关,当设置为true时启用严格的阶段验证机制
+ /// 严格阶段验证开关,当设置为 true 时启用严格的阶段验证机制。
+ /// 默认值为 false,表示不启用严格验证。
///
public bool StrictPhaseValidation { get; set; }
+
+ ///
+ /// 启用 ECS(Entity Component System)功能的开关。
+ /// 当设置为 true 时,架构将启用 ECS 相关功能。
+ ///
+ public bool EnableEcs { get; set; }
}
\ No newline at end of file
diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs
index 7e4ba9c..c4c4e6e 100644
--- a/GFramework.Core/architecture/Architecture.cs
+++ b/GFramework.Core/architecture/Architecture.cs
@@ -68,10 +68,7 @@ public abstract class Architecture(
///
private IEnvironment Environment { get; } = environment ?? new DefaultEnvironment();
- ///
- /// 获取架构服务对象
- ///
- private IArchitectureServices Services { get; } = services ?? new ArchitectureServices();
+ private ArchitectureServices Services { get; } = services as ArchitectureServices ?? new ArchitectureServices();
///
/// 获取依赖注入容器
@@ -401,6 +398,10 @@ public abstract class Architecture(
_disposables.Clear();
_disposableSet.Clear();
+
+ // 销毁服务模块
+ await Services.ModuleManager.DestroyAllAsync();
+
Container.Clear();
// 进入已销毁阶段
@@ -640,6 +641,9 @@ public abstract class Architecture(
_logger = LoggerFactoryResolver.Provider.CreateLogger(GetType().Name);
Environment.Initialize();
+ // 注册内置服务模块(根据配置)
+ Services.ModuleManager.RegisterBuiltInModules(Container, Configuration.ArchitectureProperties);
+
// 将 Environment 注册到容器(如果尚未注册)
if (!Container.Contains())
Container.RegisterPlurality(Environment);
@@ -657,6 +661,10 @@ public abstract class Architecture(
// 执行服务钩子
Container.ExecuteServicesHook(Configurator);
+
+ // 初始化服务模块
+ await Services.ModuleManager.InitializeAllAsync(asyncMode);
+
// === 用户 OnInitialize ===
_logger.Debug("Calling user OnInitialize()");
OnInitialize();
diff --git a/GFramework.Core/architecture/ArchitectureContext.cs b/GFramework.Core/architecture/ArchitectureContext.cs
index d627072..8c81368 100644
--- a/GFramework.Core/architecture/ArchitectureContext.cs
+++ b/GFramework.Core/architecture/ArchitectureContext.cs
@@ -1,4 +1,3 @@
-using System.Diagnostics.CodeAnalysis;
using GFramework.Core.Abstractions.architecture;
using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.ecs;
@@ -9,7 +8,6 @@ using GFramework.Core.Abstractions.model;
using GFramework.Core.Abstractions.query;
using GFramework.Core.Abstractions.system;
using GFramework.Core.Abstractions.utility;
-using GFramework.Core.ecs;
using Mediator;
using ICommand = GFramework.Core.Abstractions.command.ICommand;
@@ -22,10 +20,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
{
private readonly IIocContainer _container = container ?? throw new ArgumentNullException(nameof(container));
private readonly Dictionary _serviceCache = new();
- private EcsSystemRunner? _ecsRunner;
- private EcsWorld? _ecsWorld;
- #region Mediator Integration (新实现)
+ #region Mediator Integration
///
/// 获取 Mediator 实例(延迟加载)
@@ -424,56 +420,22 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
/// 获取ECS世界实例
///
/// ECS世界实例
- [Experimental("GFrameworkECS")]
public IEcsWorld GetEcsWorld()
{
- return _ecsWorld ??
- throw new InvalidOperationException("ECS World not initialized. Call InitializeEcs() first.");
+ var ecsWorld = GetOrCache();
+ return ecsWorld ??
+ throw new InvalidOperationException("ECS World not initialized. Enable ECS in configuration.");
}
///
/// 注册ECS系统
///
/// ECS系统类型
- [Experimental("GFrameworkECS")]
public void RegisterEcsSystem() where T : class, IEcsSystem
{
// 使用RegisterPlurality注册到所有接口
_container.RegisterPlurality();
}
- ///
- /// 初始化ECS(在架构初始化时调用)
- ///
- [Experimental("GFrameworkECS")]
- public void InitializeEcs()
- {
- if (_ecsWorld != null) return;
-
- // 创建ECS世界
- _ecsWorld = new EcsWorld();
- _container.Register(_ecsWorld);
-
- // 注册系统调度器
- _container.RegisterPlurality();
- _ecsRunner = _container.Get();
- }
-
- ///
- /// 获取ECS系统调度器
- ///
- internal EcsSystemRunner? GetEcsRunner() => _ecsRunner;
-
- ///
- /// 销毁ECS资源
- ///
- [Experimental("GFrameworkECS")]
- private void DisposeEcs()
- {
- _ecsWorld?.Dispose();
- _ecsWorld = null;
- _ecsRunner = null;
- }
-
#endregion
}
\ No newline at end of file
diff --git a/GFramework.Core/architecture/ArchitectureServices.cs b/GFramework.Core/architecture/ArchitectureServices.cs
index bd6656a..2aeee68 100644
--- a/GFramework.Core/architecture/ArchitectureServices.cs
+++ b/GFramework.Core/architecture/ArchitectureServices.cs
@@ -3,94 +3,71 @@ using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.ioc;
using GFramework.Core.Abstractions.query;
-using GFramework.Core.command;
-using GFramework.Core.events;
using GFramework.Core.ioc;
-using GFramework.Core.query;
+using GFramework.Core.services;
namespace GFramework.Core.architecture;
///
-/// 架构服务类,提供依赖注入容器、事件系统、命令总线和查询总线等核心服务
+/// 架构服务类,提供依赖注入容器、事件系统、命令总线和查询总线等核心服务。
+/// 该类负责管理架构运行所需的核心组件,并提供统一的服务访问接口。
///
public class ArchitectureServices : IArchitectureServices
{
- ///
- /// 异步查询执行器实例
- ///
- private readonly IAsyncQueryExecutor _asyncQueryExecutor;
-
- ///
- /// 命令执行器实例
- ///
- private readonly ICommandExecutor _commandExecutor;
-
- ///
- /// 事件总线实例
- ///
- private readonly IEventBus _eventBus;
-
- ///
- /// 同步查询执行器实例
- ///
- private readonly IQueryExecutor _queryExecutor;
-
- ///
- /// 架构上下文对象
- ///
+ private readonly IServiceModuleManager _moduleManager;
private IArchitectureContext _context = null!;
///
- /// 构造函数,初始化架构服务
+ /// 构造函数,初始化架构服务。
/// 初始化依赖注入容器,并创建事件总线、命令执行器、查询执行器和异步查询执行器的实例,
/// 然后将这些服务注册到容器中。
///
public ArchitectureServices()
{
Container = new MicrosoftDiContainer();
-
- // 创建服务实例
- _eventBus = new EventBus();
- _commandExecutor = new CommandExecutor();
- _queryExecutor = new QueryExecutor();
- _asyncQueryExecutor = new AsyncQueryExecutor();
-
- // 将服务注册到容器
- Container.RegisterPlurality(_eventBus);
- Container.RegisterPlurality(_commandExecutor);
- Container.RegisterPlurality(_queryExecutor);
- Container.RegisterPlurality(_asyncQueryExecutor);
+ _moduleManager = new ServiceModuleManager();
}
///
- /// 获取依赖注入容器
+ /// 获取服务模块管理器实例。
+ /// 服务模块管理器用于管理架构中的服务模块,支持模块的动态加载和卸载。
+ ///
+ public IServiceModuleManager ModuleManager => _moduleManager;
+
+ ///
+ /// 获取依赖注入容器。
+ /// 该容器用于管理架构中所有服务的生命周期和依赖关系。
///
public IIocContainer Container { get; }
///
- /// 获取事件总线实例
+ /// 获取事件总线实例。
+ /// 事件总线用于在架构中发布和订阅事件,实现组件间的松耦合通信。
///
- public IEventBus EventBus => _eventBus;
+ public IEventBus EventBus => Container.Get()!;
///
- /// 获取命令执行器实例
+ /// 获取命令执行器实例。
+ /// 命令执行器用于处理命令请求,执行业务逻辑。
///
- public ICommandExecutor CommandExecutor => _commandExecutor;
+ public ICommandExecutor CommandExecutor => Container.Get()!;
///
- /// 获取同步查询执行器实例
+ /// 获取查询执行器实例。
+ /// 查询执行器用于处理同步查询请求,获取数据或状态信息。
///
- public IQueryExecutor QueryExecutor => _queryExecutor;
+ public IQueryExecutor QueryExecutor => Container.Get()!;
///
- /// 获取异步查询执行器实例
+ /// 获取异步查询执行器实例。
+ /// 异步查询执行器用于处理异步查询请求,支持非阻塞的数据获取操作。
///
- public IAsyncQueryExecutor AsyncQueryExecutor => _asyncQueryExecutor;
+ public IAsyncQueryExecutor AsyncQueryExecutor => Container.Get()!;
///
- /// 设置架构上下文
+ /// 设置架构上下文。
///
- /// 架构上下文对象
+ /// 要设置的架构上下文实例。
public void SetContext(IArchitectureContext context)
{
_context = context;
@@ -98,9 +75,9 @@ public class ArchitectureServices : IArchitectureServices
}
///
- /// 获取架构上下文
+ /// 获取当前架构上下文。
///
- /// 架构上下文对象
+ /// 当前的架构上下文实例。
public IArchitectureContext GetContext()
{
return _context;
diff --git a/GFramework.Core/services/ServiceModuleManager.cs b/GFramework.Core/services/ServiceModuleManager.cs
new file mode 100644
index 0000000..067047d
--- /dev/null
+++ b/GFramework.Core/services/ServiceModuleManager.cs
@@ -0,0 +1,139 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.Abstractions.lifecycle;
+using GFramework.Core.Abstractions.logging;
+using GFramework.Core.Abstractions.properties;
+using GFramework.Core.logging;
+using GFramework.Core.services.modules;
+
+namespace GFramework.Core.services;
+
+///
+/// 服务模块管理器,负责注册、初始化和销毁架构中的服务模块。
+/// 支持模块的优先级排序、异步初始化和异常安全的销毁流程。
+///
+public sealed class ServiceModuleManager : IServiceModuleManager
+{
+ private readonly ILogger _logger = LoggerFactoryResolver.Provider.CreateLogger(nameof(ServiceModuleManager));
+ private readonly List _modules = [];
+
+ ///
+ /// 注册单个服务模块。
+ /// 如果模块为空或已存在同名模块,则记录警告日志并跳过注册。
+ ///
+ /// 要注册的服务模块实例。
+ public void RegisterModule(IServiceModule? module)
+ {
+ if (module == null)
+ {
+ _logger.Warn("Attempted to register null module");
+ return;
+ }
+
+ if (_modules.Any(m => m.ModuleName == module.ModuleName))
+ {
+ _logger.Warn($"Module {module.ModuleName} already registered");
+ return;
+ }
+
+ _modules.Add(module);
+ _logger.Debug($"Module registered: {module.ModuleName} (Priority: {module.Priority})");
+ }
+
+ ///
+ /// 注册内置服务模块。
+ /// 根据配置属性决定是否启用特定模块(如ECS模块),并对模块按优先级排序后注册到容器中。
+ ///
+ /// 依赖注入容器,用于注册模块提供的服务。
+ /// 架构配置属性,用于控制模块的启用状态。
+ public void RegisterBuiltInModules(IIocContainer container, ArchitectureProperties properties)
+ {
+ RegisterModule(new EventBusModule());
+ RegisterModule(new CommandExecutorModule());
+ RegisterModule(new QueryExecutorModule());
+ RegisterModule(new AsyncQueryExecutorModule());
+
+ if (properties.EnableEcs)
+ {
+ RegisterModule(new EcsModule(enabled: true));
+ _logger.Info("ECS module enabled via configuration");
+ }
+
+ var sortedModules = _modules.OrderBy(m => m.Priority).ToList();
+ _modules.Clear();
+ _modules.AddRange(sortedModules);
+
+ foreach (var module in _modules.Where(module => module.IsEnabled))
+ {
+ _logger.Debug($"Registering services for module: {module.ModuleName}");
+ module.Register(container);
+ }
+
+ _logger.Info($"Registered {_modules.Count} built-in service modules");
+ }
+
+ ///
+ /// 获取所有已注册的服务模块列表。
+ ///
+ /// 只读的服务模块列表。
+ public IReadOnlyList GetModules()
+ {
+ return _modules.AsReadOnly();
+ }
+
+ ///
+ /// 异步初始化所有启用的服务模块。
+ /// 支持同步和异步初始化模式,优先使用异步接口(如果模块实现了IAsyncInitializable)。
+ ///
+ /// 是否启用异步初始化模式。
+ /// 表示异步操作的任务。
+ public async Task InitializeAllAsync(bool asyncMode)
+ {
+ _logger.Info($"Initializing {_modules.Count} service modules");
+
+ foreach (var module in _modules.Where(m => m.IsEnabled))
+ {
+ _logger.Debug($"Initializing module: {module.ModuleName}");
+
+ if (asyncMode && module is IAsyncInitializable asyncInitializable)
+ {
+ await asyncInitializable.InitializeAsync();
+ }
+ else
+ {
+ module.Initialize();
+ }
+ }
+
+ _logger.Info("All service modules initialized");
+ }
+
+ ///
+ /// 异步销毁所有启用的服务模块。
+ /// 按逆序销毁模块以确保依赖关系正确释放,并捕获异常避免中断整个销毁流程。
+ ///
+ /// 表示异步操作的值任务。
+ public async ValueTask DestroyAllAsync()
+ {
+ _logger.Info($"Destroying {_modules.Count} service modules");
+
+ for (var i = _modules.Count - 1; i >= 0; i--)
+ {
+ var module = _modules[i];
+ if (!module.IsEnabled) continue;
+
+ try
+ {
+ _logger.Debug($"Destroying module: {module.ModuleName}");
+ await module.DestroyAsync();
+ }
+ catch (Exception ex)
+ {
+ _logger.Error($"Error destroying module {module.ModuleName}", ex);
+ }
+ }
+
+ _modules.Clear();
+ _logger.Info("All service modules destroyed");
+ }
+}
\ No newline at end of file
diff --git a/GFramework.Core/services/modules/AsyncQueryExecutorModule.cs b/GFramework.Core/services/modules/AsyncQueryExecutorModule.cs
new file mode 100644
index 0000000..046e1d9
--- /dev/null
+++ b/GFramework.Core/services/modules/AsyncQueryExecutorModule.cs
@@ -0,0 +1,55 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.query;
+
+namespace GFramework.Core.services.modules;
+
+///
+/// 异步查询执行器模块,用于注册和管理异步查询执行器服务。
+/// 该模块负责将异步查询执行器注册到依赖注入容器中,并在销毁时释放相关资源。
+///
+public sealed class AsyncQueryExecutorModule : IServiceModule
+{
+ ///
+ /// 获取模块名称。
+ ///
+ public string ModuleName => nameof(AsyncQueryExecutorModule);
+
+ ///
+ /// 获取模块优先级,数值越小优先级越高。
+ ///
+ public int Priority => 40;
+
+ ///
+ /// 获取模块启用状态,始终返回 true 表示该模块默认启用。
+ ///
+ public bool IsEnabled => true;
+
+ ///
+ /// 注册异步查询执行器到依赖注入容器。
+ /// 创建异步查询执行器实例并将其注册为多例服务。
+ ///
+ /// 依赖注入容器实例。
+ public void Register(IIocContainer container)
+ {
+ container.RegisterPlurality(new AsyncQueryExecutor());
+ }
+
+ ///
+ /// 初始化模块。
+ /// 当前实现为空,因为异步查询执行器无需额外初始化逻辑。
+ ///
+ public void Initialize()
+ {
+ }
+
+ ///
+ /// 异步销毁模块并释放资源。
+ /// 将异步查询执行器引用置空以允许垃圾回收。
+ ///
+ /// 表示异步操作完成的任务。
+ public ValueTask DestroyAsync()
+ {
+ return ValueTask.CompletedTask;
+ }
+}
\ No newline at end of file
diff --git a/GFramework.Core/services/modules/CommandExecutorModule.cs b/GFramework.Core/services/modules/CommandExecutorModule.cs
new file mode 100644
index 0000000..a28e034
--- /dev/null
+++ b/GFramework.Core/services/modules/CommandExecutorModule.cs
@@ -0,0 +1,55 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.command;
+
+namespace GFramework.Core.services.modules;
+
+///
+/// 命令执行器模块,用于注册和管理命令执行器服务。
+/// 该模块负责将命令执行器注册到依赖注入容器中,并在销毁时释放相关资源。
+///
+public sealed class CommandExecutorModule : IServiceModule
+{
+ ///
+ /// 获取模块名称。
+ ///
+ public string ModuleName => nameof(CommandExecutorModule);
+
+ ///
+ /// 获取模块优先级,数值越小优先级越高。
+ ///
+ public int Priority => 20;
+
+ ///
+ /// 获取模块启用状态,始终返回 true 表示该模块默认启用。
+ ///
+ public bool IsEnabled => true;
+
+ ///
+ /// 注册命令执行器到依赖注入容器。
+ /// 创建命令执行器实例并将其注册为多例服务。
+ ///
+ /// 依赖注入容器实例。
+ public void Register(IIocContainer container)
+ {
+ container.RegisterPlurality(new CommandExecutor());
+ }
+
+ ///
+ /// 初始化模块。
+ /// 当前实现为空,因为命令执行器无需额外初始化逻辑。
+ ///
+ public void Initialize()
+ {
+ }
+
+ ///
+ /// 异步销毁模块并释放资源。
+ /// 将命令执行器引用置空以允许垃圾回收。
+ ///
+ /// 表示异步操作完成的任务。
+ public ValueTask DestroyAsync()
+ {
+ return ValueTask.CompletedTask;
+ }
+}
\ No newline at end of file
diff --git a/GFramework.Core/services/modules/EcsModule.cs b/GFramework.Core/services/modules/EcsModule.cs
new file mode 100644
index 0000000..bedf040
--- /dev/null
+++ b/GFramework.Core/services/modules/EcsModule.cs
@@ -0,0 +1,110 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ecs;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.Abstractions.lifecycle;
+using GFramework.Core.ecs;
+
+namespace GFramework.Core.services.modules;
+
+///
+/// ECS(Entity Component System)模块,用于注册、初始化和管理ECS相关服务。
+/// 该模块负责创建ECS世界和系统运行器,并将其注册到依赖注入容器中。
+///
+public sealed class EcsModule : IServiceModule
+{
+ private EcsSystemRunner? _ecsRunner;
+
+ private EcsWorld? _ecsWorld;
+
+ ///
+ /// 构造函数,初始化ECS模块。
+ ///
+ /// 指定模块是否启用,默认为 true。
+ public EcsModule(bool enabled = true)
+ {
+ IsEnabled = enabled;
+ }
+
+ ///
+ /// 获取模块名称。
+ ///
+ public string ModuleName => nameof(EcsModule);
+
+ ///
+ /// 获取模块优先级,数值越小优先级越高。
+ ///
+ public int Priority => 100;
+
+ ///
+ /// 获取模块启用状态。
+ ///
+ public bool IsEnabled { get; }
+
+ ///
+ /// 注册ECS相关服务到依赖注入容器中。
+ /// 包括ECS世界实例和系统运行器实例的注册。
+ ///
+ /// 依赖注入容器实例。
+ public void Register(IIocContainer container)
+ {
+ if (!IsEnabled) return;
+
+ _ecsWorld = new EcsWorld();
+ container.Register(_ecsWorld);
+ container.Register(_ecsWorld);
+
+ container.RegisterPlurality();
+ _ecsRunner = container.Get();
+ }
+
+ ///
+ /// 初始化ECS模块。
+ /// 如果系统运行器实现了IInitializable接口,则调用其初始化方法。
+ ///
+ public void Initialize()
+ {
+ if (!IsEnabled || _ecsRunner == null) return;
+
+ if (_ecsRunner is IInitializable initializable)
+ {
+ initializable.Initialize();
+ }
+ }
+
+ ///
+ /// 异步销毁ECS模块并释放相关资源。
+ /// 包括销毁系统运行器和释放ECS世界资源。
+ ///
+ /// 表示异步操作完成的任务。
+ public async ValueTask DestroyAsync()
+ {
+ if (!IsEnabled) return;
+
+ if (_ecsRunner is IDestroyable destroyable)
+ {
+ destroyable.Destroy();
+ }
+
+ _ecsRunner = null;
+
+ if (_ecsWorld != null)
+ {
+ _ecsWorld.Dispose();
+ _ecsWorld = null;
+ }
+
+ await ValueTask.CompletedTask;
+ }
+
+ ///
+ /// 获取ECS世界实例。
+ ///
+ /// ECS世界实例,如果未启用则返回 null。
+ public IEcsWorld? GetEcsWorld() => _ecsWorld;
+
+ ///
+ /// 获取ECS系统运行器实例(内部使用)。
+ ///
+ /// ECS系统运行器实例,如果未启用则返回 null。
+ internal EcsSystemRunner? GetEcsRunner() => _ecsRunner;
+}
\ No newline at end of file
diff --git a/GFramework.Core/services/modules/EventBusModule.cs b/GFramework.Core/services/modules/EventBusModule.cs
new file mode 100644
index 0000000..854f490
--- /dev/null
+++ b/GFramework.Core/services/modules/EventBusModule.cs
@@ -0,0 +1,55 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.events;
+
+namespace GFramework.Core.services.modules;
+
+///
+/// 事件总线模块,用于注册和管理事件总线服务。
+/// 该模块负责将事件总线注册到依赖注入容器中,并提供初始化和销毁功能。
+///
+public sealed class EventBusModule : IServiceModule
+{
+ ///
+ /// 获取模块名称。
+ ///
+ public string ModuleName => nameof(EventBusModule);
+
+ ///
+ /// 获取模块优先级,数值越小优先级越高。
+ ///
+ public int Priority => 10;
+
+ ///
+ /// 获取模块启用状态,始终返回 true 表示该模块默认启用。
+ ///
+ public bool IsEnabled => true;
+
+ ///
+ /// 注册事件总线到依赖注入容器。
+ /// 创建事件总线实例并将其注册为多例服务。
+ ///
+ /// 依赖注入容器实例。
+ public void Register(IIocContainer container)
+ {
+ container.RegisterPlurality(new EventBus());
+ }
+
+ ///
+ /// 初始化模块。
+ /// 当前实现为空,因为事件总线无需额外初始化逻辑。
+ ///
+ public void Initialize()
+ {
+ }
+
+ ///
+ /// 异步销毁模块。
+ /// 当前实现为空,因为事件总线无需特殊销毁逻辑。
+ ///
+ /// 表示异步操作完成的任务。
+ public ValueTask DestroyAsync()
+ {
+ return ValueTask.CompletedTask;
+ }
+}
\ No newline at end of file
diff --git a/GFramework.Core/services/modules/QueryExecutorModule.cs b/GFramework.Core/services/modules/QueryExecutorModule.cs
new file mode 100644
index 0000000..ed8991b
--- /dev/null
+++ b/GFramework.Core/services/modules/QueryExecutorModule.cs
@@ -0,0 +1,55 @@
+using GFramework.Core.Abstractions.architecture;
+using GFramework.Core.Abstractions.ioc;
+using GFramework.Core.query;
+
+namespace GFramework.Core.services.modules;
+
+///
+/// 查询执行器模块,用于注册和管理查询执行器服务。
+/// 该模块负责将查询执行器注册到依赖注入容器中,并提供初始化和销毁功能。
+///
+public sealed class QueryExecutorModule : IServiceModule
+{
+ ///
+ /// 获取模块名称。
+ ///
+ public string ModuleName => nameof(QueryExecutorModule);
+
+ ///
+ /// 获取模块优先级,数值越小优先级越高。
+ ///
+ public int Priority => 30;
+
+ ///
+ /// 获取模块启用状态,始终返回 true 表示该模块默认启用。
+ ///
+ public bool IsEnabled => true;
+
+ ///
+ /// 注册查询执行器到依赖注入容器。
+ /// 创建查询执行器实例并将其注册为多例服务。
+ ///
+ /// 依赖注入容器实例。
+ public void Register(IIocContainer container)
+ {
+ container.RegisterPlurality(new QueryExecutor());
+ }
+
+ ///
+ /// 初始化模块。
+ /// 当前实现为空,因为查询执行器无需额外初始化逻辑。
+ ///
+ public void Initialize()
+ {
+ }
+
+ ///
+ /// 异步销毁模块。
+ /// 当前实现为空,因为查询执行器无需特殊销毁逻辑。
+ ///
+ /// 表示异步操作完成的任务。
+ public ValueTask DestroyAsync()
+ {
+ return ValueTask.CompletedTask;
+ }
+}
\ No newline at end of file