From 1c1385ee242726173b31a16f84e1394502ad4109 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Sun, 18 Jan 2026 20:53:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(architecture):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=9F=A5=E8=AF=A2=E6=80=BB=E7=BA=BF=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在Architecture类中添加AsyncQueryBus属性 - 在ArchitectureContext中添加异步查询执行方法SendQueryAsync - 在ArchitectureServices中添加AsyncQueryBus服务实例 - 扩展IArchitectureContext接口以包含异步查询方法 - 扩展IArchitectureServices接口以包含异步查询总线 - 更新ArchitectureContext构造函数以接受异步查询总线参数 - 为ArchitectureContextTests添加异步查询总线相关测试用例 - 更新测试中的构造函数调用以包含新的异步查询总线参数 --- .../architecture/IArchitectureContext.cs | 8 ++ .../architecture/IArchitectureServices.cs | 7 +- .../architecture/ArchitectureContextTests.cs | 78 +++++++++++++++++-- .../architecture/ArchitectureServicesTests.cs | 3 + .../architecture/GameContextTests.cs | 8 ++ .../state/StateMachineSystemTests.cs | 3 +- GFramework.Core/architecture/Architecture.cs | 8 +- .../architecture/ArchitectureContext.cs | 18 ++++- .../architecture/ArchitectureServices.cs | 8 +- 9 files changed, 129 insertions(+), 12 deletions(-) diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs index 87c43bc..91fa53b 100644 --- a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs +++ b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs @@ -72,6 +72,14 @@ public interface IArchitectureContext /// 查询结果 TResult SendQuery(IQuery query); + /// + /// 异步发送一个查询请求 + /// + /// 查询结果类型 + /// 要发送的异步查询 + /// 查询结果 + Task SendQueryAsync(IAsyncQuery query); + /// /// 发送一个事件 /// diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs b/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs index efdb88e..ef4c7ca 100644 --- a/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs +++ b/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs @@ -1,4 +1,4 @@ -using GFramework.Core.Abstractions.command; +using GFramework.Core.Abstractions.command; using GFramework.Core.Abstractions.events; using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.query; @@ -32,4 +32,9 @@ public interface IArchitectureServices : IContextAware /// 获取查询总线 /// public IQueryBus QueryBus { get; } + + /// + /// 获取异步查询总线 + /// + public IAsyncQueryBus AsyncQueryBus { get; } } \ No newline at end of file diff --git a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs index 07e4d22..082a2ff 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs @@ -60,8 +60,9 @@ public class ArchitectureContextTests _eventBus = new EventBus(); _commandBus = new CommandBus(); _queryBus = new QueryBus(); + _asyncQueryBus = new AsyncQueryBus(); _environment = new DefaultEnvironment(); - _context = new ArchitectureContext(_container, _eventBus, _commandBus, _queryBus, _environment); + _context = new ArchitectureContext(_container, _eventBus, _commandBus, _queryBus, _environment, _asyncQueryBus); } private ArchitectureContext? _context; @@ -69,6 +70,7 @@ public class ArchitectureContextTests private EventBus? _eventBus; private CommandBus? _commandBus; private QueryBus? _queryBus; + private AsyncQueryBus? _asyncQueryBus; private DefaultEnvironment? _environment; /// @@ -77,17 +79,75 @@ public class ArchitectureContextTests [Test] public void Constructor_Should_NotThrow_When_AllParameters_AreValid() { - Assert.That(() => new ArchitectureContext(_container!, _eventBus!, _commandBus!, _queryBus!, _environment!), + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, _commandBus!, _queryBus!, _environment!, + _asyncQueryBus!), Throws.Nothing); } + /// + /// 测试构造函数在 container 为 null 时应抛出 ArgumentNullException + /// + [Test] + public void Constructor_Should_Throw_When_Container_IsNull() + { + Assert.That( + () => new ArchitectureContext(null!, _eventBus!, _commandBus!, _queryBus!, _environment!, _asyncQueryBus!), + Throws.ArgumentNullException); + } + + /// + /// 测试构造函数在 eventBus 为 null 时应抛出 ArgumentNullException + /// + [Test] + public void Constructor_Should_Throw_When_EventBus_IsNull() + { + Assert.That( + () => new ArchitectureContext(_container!, null!, _commandBus!, _queryBus!, _environment!, _asyncQueryBus!), + Throws.ArgumentNullException); + } + + /// + /// 测试构造函数在 commandBus 为 null 时应抛出 ArgumentNullException + /// + [Test] + public void Constructor_Should_Throw_When_CommandBus_IsNull() + { + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, null!, _queryBus!, _environment!, _asyncQueryBus!), + Throws.ArgumentNullException); + } + + /// + /// 测试构造函数在 queryBus 为 null 时应抛出 ArgumentNullException + /// + [Test] + public void Constructor_Should_Throw_When_QueryBus_IsNull() + { + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, _commandBus!, null!, _environment!, _asyncQueryBus!), + Throws.ArgumentNullException); + } + + /// + /// 测试构造函数在 environment 为 null 时应抛出 ArgumentNullException + /// + [Test] + public void Constructor_Should_Throw_When_Environment_IsNull() + { + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, _commandBus!, _queryBus!, null!, _asyncQueryBus!), + Throws.ArgumentNullException); + } + /// /// 测试构造函数在Container为null时应抛出ArgumentNullException /// [Test] public void Constructor_Should_ThrowArgumentNullException_When_Container_IsNull() { - Assert.That(() => new ArchitectureContext(null!, _eventBus!, _commandBus!, _queryBus!, _environment!), + Assert.That( + () => new ArchitectureContext(null!, _eventBus!, _commandBus!, _queryBus!, _environment!, _asyncQueryBus!), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("container")); } @@ -97,7 +157,8 @@ public class ArchitectureContextTests [Test] public void Constructor_Should_ThrowArgumentNullException_When_EventBus_IsNull() { - Assert.That(() => new ArchitectureContext(_container!, null!, _commandBus!, _queryBus!, _environment!), + Assert.That( + () => new ArchitectureContext(_container!, null!, _commandBus!, _queryBus!, _environment!, _asyncQueryBus!), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("eventBus")); } @@ -107,7 +168,8 @@ public class ArchitectureContextTests [Test] public void Constructor_Should_ThrowArgumentNullException_When_CommandBus_IsNull() { - Assert.That(() => new ArchitectureContext(_container!, _eventBus!, null!, _queryBus!, _environment!), + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, null!, _queryBus!, _environment!, _asyncQueryBus!), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("commandBus")); } @@ -117,7 +179,8 @@ public class ArchitectureContextTests [Test] public void Constructor_Should_ThrowArgumentNullException_When_QueryBus_IsNull() { - Assert.That(() => new ArchitectureContext(_container!, _eventBus!, _commandBus!, null!, _environment!), + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, _commandBus!, null!, _environment!, _asyncQueryBus!), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("queryBus")); } @@ -127,7 +190,8 @@ public class ArchitectureContextTests [Test] public void Constructor_Should_ThrowArgumentNullException_When_Environment_IsNull() { - Assert.That(() => new ArchitectureContext(_container!, _eventBus!, _commandBus!, _queryBus!, null!), + Assert.That( + () => new ArchitectureContext(_container!, _eventBus!, _commandBus!, _queryBus!, null!, _asyncQueryBus!), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("environment")); } diff --git a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs index 2e20a1d..9459b36 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs @@ -262,6 +262,9 @@ public class TestArchitectureContextV3 : IArchitectureContext } public TResult SendQuery(IQuery query) => default!; + + public Task SendQueryAsync(IAsyncQuery query) => (Task)Task.CompletedTask; + public IEnvironment GetEnvironment() => _environment; } diff --git a/GFramework.Core.Tests/architecture/GameContextTests.cs b/GFramework.Core.Tests/architecture/GameContextTests.cs index 8818f05..a99ede0 100644 --- a/GFramework.Core.Tests/architecture/GameContextTests.cs +++ b/GFramework.Core.Tests/architecture/GameContextTests.cs @@ -345,6 +345,14 @@ public class TestArchitectureContext : IArchitectureContext /// 查询结果 public TResult SendQuery(IQuery query) => default!; + /// + /// 异步发送查询请求 + /// + /// 查询结果类型 + /// 异步查询对象 + /// 查询结果 + public Task SendQueryAsync(IAsyncQuery query) => (Task)Task.CompletedTask; + /// /// 获取环境对象 /// diff --git a/GFramework.Core.Tests/state/StateMachineSystemTests.cs b/GFramework.Core.Tests/state/StateMachineSystemTests.cs index bc28b49..0ca3db0 100644 --- a/GFramework.Core.Tests/state/StateMachineSystemTests.cs +++ b/GFramework.Core.Tests/state/StateMachineSystemTests.cs @@ -41,7 +41,8 @@ public class StateMachineSystemTests _eventBus, new CommandBus(), new QueryBus(), - new DefaultEnvironment()); + new DefaultEnvironment(), + new AsyncQueryBus()); _stateMachine = new TestStateMachineSystemV5(); _stateMachine.SetContext(_context); diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index c4c038e..eb20da2 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -14,6 +14,7 @@ using GFramework.Core.environment; using GFramework.Core.events; using GFramework.Core.extensions; using GFramework.Core.logging; +using IAsyncQueryBus = GFramework.Core.Abstractions.query.IAsyncQueryBus; using IDisposable = GFramework.Core.Abstractions.lifecycle.IDisposable; namespace GFramework.Core.architecture; @@ -88,6 +89,11 @@ public abstract class Architecture( /// private IQueryBus QueryBus => Services.QueryBus; + /// + /// 获取异步查询总线 + /// + private IAsyncQueryBus AsyncQueryBus => Services.AsyncQueryBus; + /// /// 当前架构的阶段 /// @@ -548,7 +554,7 @@ public abstract class Architecture( Environment.Initialize(); // 初始化架构上下文(如果尚未初始化) - _context ??= new ArchitectureContext(Container, EventBus, CommandBus, QueryBus, Environment); + _context ??= new ArchitectureContext(Container, EventBus, CommandBus, QueryBus, Environment, AsyncQueryBus); GameContext.Bind(GetType(), _context); // 为服务设置上下文 diff --git a/GFramework.Core/architecture/ArchitectureContext.cs b/GFramework.Core/architecture/ArchitectureContext.cs index c4031b6..567f9dd 100644 --- a/GFramework.Core/architecture/ArchitectureContext.cs +++ b/GFramework.Core/architecture/ArchitectureContext.cs @@ -7,6 +7,7 @@ using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.query; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; +using IAsyncQueryBus = GFramework.Core.Abstractions.query.IAsyncQueryBus; namespace GFramework.Core.architecture; @@ -18,9 +19,13 @@ public class ArchitectureContext( IEventBus eventBus, ICommandBus commandBus, IQueryBus queryBus, - IEnvironment environment) + IEnvironment environment, + IAsyncQueryBus asyncQueryBus) : IArchitectureContext { + private readonly IAsyncQueryBus _asyncQueryBus = + asyncQueryBus ?? throw new ArgumentNullException(nameof(asyncQueryBus)); + private readonly ICommandBus _commandBus = commandBus ?? throw new ArgumentNullException(nameof(commandBus)); private readonly IIocContainer _container = container ?? throw new ArgumentNullException(nameof(container)); @@ -44,6 +49,17 @@ public class ArchitectureContext( return query == null ? throw new ArgumentNullException(nameof(query)) : _queryBus.Send(query); } + /// + /// 异步发送一个查询请求 + /// + /// 查询结果类型 + /// 要发送的异步查询 + /// 查询结果 + public Task SendQueryAsync(IAsyncQuery query) + { + return query == null ? throw new ArgumentNullException(nameof(query)) : _asyncQueryBus.SendAsync(query); + } + #endregion #region Component Retrieval diff --git a/GFramework.Core/architecture/ArchitectureServices.cs b/GFramework.Core/architecture/ArchitectureServices.cs index d79bd18..0f7c7cc 100644 --- a/GFramework.Core/architecture/ArchitectureServices.cs +++ b/GFramework.Core/architecture/ArchitectureServices.cs @@ -1,4 +1,4 @@ -using GFramework.Core.Abstractions.architecture; +using GFramework.Core.Abstractions.architecture; using GFramework.Core.Abstractions.command; using GFramework.Core.Abstractions.events; using GFramework.Core.Abstractions.ioc; @@ -7,6 +7,7 @@ using GFramework.Core.command; using GFramework.Core.events; using GFramework.Core.ioc; using GFramework.Core.query; +using IAsyncQueryBus = GFramework.Core.Abstractions.query.IAsyncQueryBus; namespace GFramework.Core.architecture; @@ -37,6 +38,11 @@ public class ArchitectureServices : IArchitectureServices /// public IQueryBus QueryBus { get; } = new QueryBus(); + /// + /// 获取异步查询总线 + /// + public IAsyncQueryBus AsyncQueryBus { get; } = new AsyncQueryBus(); + /// /// 设置架构上下文 ///