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();
+
///
/// 设置架构上下文
///