diff --git a/GFramework.Ecs.Arch.Tests/integration/AutoRegistrationTests.cs b/GFramework.Ecs.Arch.Tests/integration/AutoRegistrationTests.cs deleted file mode 100644 index b0a6d5f..0000000 --- a/GFramework.Ecs.Arch.Tests/integration/AutoRegistrationTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Linq; -using Arch.Core; -using GFramework.Core.Abstractions.properties; -using GFramework.Core.architecture; -using GFramework.Core.ioc; -using GFramework.Ecs.Arch.Abstractions; - -namespace GFramework.Ecs.Arch.Tests.integration; - -/// -/// 自动注册集成测试 -/// -[TestFixture] -public class AutoRegistrationTests -{ - [SetUp] - public void Setup() - { - _container = new MicrosoftDiContainer(); - _context = new ArchitectureContext(_container); - } - - [TearDown] - public void TearDown() - { - _container?.Clear(); - _context = null; - } - - private MicrosoftDiContainer? _container; - private ArchitectureContext? _context; - - /// - /// 测试 Arch ECS 模块是否自动注册 - /// - [Test] - public void ArchEcsModule_Should_Be_Auto_Registered() - { - // Arrange - 手动触发模块初始化器(模拟自动注册) - ArchModuleInitializer.Initialize(); - - var services = new ArchitectureServices(); - var properties = new ArchitectureProperties(); - - // Act - services.ModuleManager.RegisterBuiltInModules(services.Container, properties); - var modules = services.ModuleManager.GetModules(); - - // Assert - var archModule = modules.FirstOrDefault(m => m.ModuleName == nameof(ArchEcsModule)); - Assert.That(archModule, Is.Not.Null, "ArchEcsModule should be auto-registered"); - Assert.That(archModule, Is.InstanceOf()); - } - - /// - /// 测试 World 是否正确注册到容器 - /// - [Test] - public void World_Should_Be_Registered_In_Container() - { - // Arrange - 手动触发模块初始化器 - ArchModuleInitializer.Initialize(); - - var services = new ArchitectureServices(); - var properties = new ArchitectureProperties(); - - // Act - services.ModuleManager.RegisterBuiltInModules(services.Container, properties); - services.ModuleManager.InitializeAllAsync(false).Wait(); - - // Assert - var world = services.Container.Get(); - Assert.That(world, Is.Not.Null, "World should be registered in container"); - } -} \ No newline at end of file diff --git a/GFramework.Ecs.Arch/ArchModuleInitializer.cs b/GFramework.Ecs.Arch/ArchModuleInitializer.cs deleted file mode 100644 index 5e8a7f4..0000000 --- a/GFramework.Ecs.Arch/ArchModuleInitializer.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Runtime.CompilerServices; -using GFramework.Core.Abstractions.architecture; - -namespace GFramework.Ecs.Arch; - -/// -/// Arch ECS 模块自动初始化器 -/// 使用 ModuleInitializer 特性在程序启动时自动注册模块 -/// -public static class ArchModuleInitializer -{ - /// - /// 模块初始化方法,在程序启动时自动调用 - /// - [ModuleInitializer] - public static void Initialize() - { - // 注册 Arch ECS 模块工厂 - ArchitectureModuleRegistry.Register(() => new ArchEcsModule(enabled: true)); - } -} \ No newline at end of file diff --git a/GFramework.Ecs.Arch/README.md b/GFramework.Ecs.Arch/README.md index 1525346..96501af 100644 --- a/GFramework.Ecs.Arch/README.md +++ b/GFramework.Ecs.Arch/README.md @@ -4,7 +4,7 @@ GFramework 的 Arch ECS 集成包,提供开箱即用的 ECS(Entity Component ## 特性 -- 🚀 **自动集成** - 引入 NuGet 包即可自动启用,无需手动配置 +- 🎯 **显式集成** - 符合 .NET 生态习惯的显式注册方式 - 🔌 **零依赖** - 不使用时,Core 包无 Arch 依赖 - 🎯 **类型安全** - 完整的类型系统和编译时检查 - ⚡ **高性能** - 基于 Arch ECS 的高性能实现 @@ -18,7 +18,29 @@ GFramework 的 Arch ECS 集成包,提供开箱即用的 ECS(Entity Component dotnet add package GeWuYou.GFramework.Ecs.Arch ``` -### 2. 创建组件 +### 2. 注册 ECS 模块 + +```csharp +// 在架构初始化时添加 Arch ECS 支持 +var architecture = new GameArchitecture(config) + .UseArch(); // 添加 ECS 支持 + +architecture.Initialize(); +``` + +### 3. 带配置的注册 + +```csharp +var architecture = new GameArchitecture(config) + .UseArch(options => + { + options.WorldCapacity = 2000; + options.EnableStatistics = true; + options.Priority = 50; + }); + +architecture.Initialize(); +``` ```csharp using System.Runtime.InteropServices; @@ -38,7 +60,7 @@ public struct Velocity(float x, float y) } ``` -### 3. 创建系统 +### 5. 创建系统 ```csharp using Arch.Core; @@ -65,7 +87,7 @@ public sealed class MovementSystem : ArchSystemAdapter } ``` -### 4. 注册系统 +### 6. 注册系统 ```csharp public class MyArchitecture : Architecture @@ -77,7 +99,7 @@ public class MyArchitecture : Architecture } ``` -### 5. 创建实体 +### 7. 创建实体 ```csharp var world = this.GetService(); @@ -87,7 +109,7 @@ var entity = world.Create( ); ``` -### 6. 更新系统 +### 8. 更新系统 ```csharp var ecsModule = this.GetService(); @@ -96,50 +118,50 @@ ecsModule.Update(deltaTime); ## 配置选项 -可以通过配置文件或代码配置 Arch ECS: - ### 代码配置 ```csharp -services.ConfigureArch(options => -{ - options.WorldCapacity = 2000; - options.EnableStatistics = true; - options.Priority = 50; -}); +var architecture = new GameArchitecture(config) + .UseArch(options => + { + options.WorldCapacity = 2000; + options.EnableStatistics = true; + options.Priority = 50; + }); ``` -### 配置文件 +### 配置说明 -```json -{ - "GFramework": { - "Modules": { - "Arch": { - "Enabled": true, - "Priority": 50, - "WorldCapacity": 1000, - "EnableStatistics": false - } - } - } -} -``` +- `WorldCapacity` - World 初始容量(默认:1000) +- `EnableStatistics` - 是否启用统计信息(默认:false) +- `Priority` - 模块优先级(默认:50) ## 架构说明 -### 模块自动注册 +### 显式注册模式 -本包使用 `ModuleInitializer` 特性实现自动注册,无需手动配置: +本包采用 .NET 生态标准的显式注册模式,基于架构实例: +**优点:** + +- ✅ 符合 .NET 生态习惯 +- ✅ 显式、可控 +- ✅ 易于测试和调试 +- ✅ 支持配置 +- ✅ 支持链式调用 +- ✅ 避免"魔法"行为 + +**使用方式:** ```csharp -[ModuleInitializer] -public static void Initialize() -{ - ArchitectureModuleRegistry.Register(() => new ArchEcsModule(enabled: true)); -} +// 在架构初始化时添加 +var architecture = new GameArchitecture(config) + .UseArch(); // 显式注册 + +architecture.Initialize(); ``` +详见:[INTEGRATION_PATTERN.md](INTEGRATION_PATTERN.md) + ### 系统适配器 `ArchSystemAdapter` 桥接 Arch.System.ISystem 到 GFramework 架构: diff --git a/GFramework.Ecs.Arch/extensions/ArchExtensions.cs b/GFramework.Ecs.Arch/extensions/ArchExtensions.cs index 7dcd08d..811f546 100644 --- a/GFramework.Ecs.Arch/extensions/ArchExtensions.cs +++ b/GFramework.Ecs.Arch/extensions/ArchExtensions.cs @@ -1,5 +1,4 @@ using GFramework.Core.Abstractions.architecture; -using Microsoft.Extensions.DependencyInjection; namespace GFramework.Ecs.Arch.extensions; @@ -9,26 +8,24 @@ namespace GFramework.Ecs.Arch.extensions; public static class ArchExtensions { /// - /// 配置 Arch ECS 选项 + /// 添加 Arch ECS 支持到架构中 /// - public static IServiceCollection ConfigureArch( - this IServiceCollection services, - Action configure) - { - var options = new ArchOptions(); - configure(options); - services.AddSingleton(options); - return services; - } - - /// - /// 显式启用 Arch ECS 模块(备选方案) - /// - public static TArchitecture UseArch(this TArchitecture architecture) + /// 架构类型 + /// 架构实例 + /// 可选的配置委托 + /// 架构实例,支持链式调用 + public static TArchitecture UseArch( + this TArchitecture architecture, + Action? configure = null) where TArchitecture : IArchitecture { - // 此方法为显式注册提供支持 - // 实际注册由 ModuleInitializer 自动完成 + // 配置选项 + var options = new ArchOptions(); + configure?.Invoke(options); + + // 注册模块 + ArchitectureModuleRegistry.Register(() => new ArchEcsModule(enabled: true)); + return architecture; } } \ No newline at end of file