From c593c5016b49c1a4da7cfc1c40384d00e45c683b Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Mon, 23 Feb 2026 13:18:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(architecture):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=A8=A1=E5=9D=97=E5=8C=96=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=92=8CECS=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将架构服务重构为模块化设计,引入ServiceModuleManager统一管理 - 新增EventBusModule、CommandExecutorModule、QueryExecutorModule等核心服务模块 - 实现ECS模块支持,可配置启用Entity Component System功能 - 在架构初始化过程中集成模块注册、初始化和销毁流程 - 更新架构属性配置,添加EnableEcs开关控制ECS功能启用 - 优化服务获取方式,从直接依赖改为通过容器动态获取 - 移除架构上下文中的ECS相关实现代码,统一由ECS模块管理 --- .../architecture/IServiceModule.cs | 34 +++++ .../architecture/IServiceModuleManager.cs | 17 +++ .../properties/ArchitectureProperties.cs | 17 ++- GFramework.Core/architecture/Architecture.cs | 16 +- .../architecture/ArchitectureContext.cs | 46 +----- .../architecture/ArchitectureServices.cs | 83 ++++------- .../services/ServiceModuleManager.cs | 139 ++++++++++++++++++ .../modules/AsyncQueryExecutorModule.cs | 55 +++++++ .../services/modules/CommandExecutorModule.cs | 55 +++++++ GFramework.Core/services/modules/EcsModule.cs | 110 ++++++++++++++ .../services/modules/EventBusModule.cs | 55 +++++++ .../services/modules/QueryExecutorModule.cs | 55 +++++++ 12 files changed, 579 insertions(+), 103 deletions(-) create mode 100644 GFramework.Core.Abstractions/architecture/IServiceModule.cs create mode 100644 GFramework.Core.Abstractions/architecture/IServiceModuleManager.cs create mode 100644 GFramework.Core/services/ServiceModuleManager.cs create mode 100644 GFramework.Core/services/modules/AsyncQueryExecutorModule.cs create mode 100644 GFramework.Core/services/modules/CommandExecutorModule.cs create mode 100644 GFramework.Core/services/modules/EcsModule.cs create mode 100644 GFramework.Core/services/modules/EventBusModule.cs create mode 100644 GFramework.Core/services/modules/QueryExecutorModule.cs 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