refactor(core): 将命令和查询总线重构为执行器模式

- 将 CommandBus 重命名为 CommandExecutor 并更新相关接口
- 将 QueryBus 重命名为 QueryExecutor 并更新相关接口
- 将 AsyncQueryBus 重命名为 AsyncQueryExecutor 并更新相关接口
- 更新 ArchitectureContext 中的服务引用和错误消息
- 修改 ArchitectureServices 中的私有字段和公共属性名称
- 更新所有测试文件中的实例变量和服务引用
- 修改测试类名称以匹配新的执行器命名
- 更新状态机系统测试中的容器注册项
This commit is contained in:
GeWuYou 2026-02-05 12:46:44 +08:00
parent 7481011780
commit c8be4b317d
23 changed files with 198 additions and 186 deletions

View File

@ -26,15 +26,15 @@ public interface IArchitectureServices : IContextAware
/// <summary> /// <summary>
/// 获取命令总线 /// 获取命令总线
/// </summary> /// </summary>
public ICommandBus CommandBus { get; } public ICommandExecutor CommandExecutor { get; }
/// <summary> /// <summary>
/// 获取查询总线 /// 获取查询总线
/// </summary> /// </summary>
public IQueryBus QueryBus { get; } public IQueryExecutor QueryExecutor { get; }
/// <summary> /// <summary>
/// 获取异步查询总线 /// 获取异步查询总线
/// </summary> /// </summary>
public IAsyncQueryBus AsyncQueryBus { get; } public IAsyncQueryExecutor AsyncQueryExecutor { get; }
} }

View File

@ -1,35 +0,0 @@
namespace GFramework.Core.Abstractions.command;
/// <summary>
/// 定义命令总线接口,用于执行各种命令
/// </summary>
public interface ICommandBus
{
/// <summary>
/// 发送并执行一个命令
/// </summary>
/// <param name="command">要执行的命令对象</param>
public void Send(ICommand command);
/// <summary>
/// 发送并执行一个带返回值的命令
/// </summary>
/// <typeparam name="TResult">命令执行结果的类型</typeparam>
/// <param name="command">要执行的带返回值的命令对象</param>
/// <returns>命令执行的结果</returns>
public TResult Send<TResult>(ICommand<TResult> command);
/// <summary>
/// 发送并异步执行一个命令
/// </summary>
/// <param name="command">要执行的命令对象</param>
Task SendAsync(IAsyncCommand command);
/// <summary>
/// 发送并异步执行一个带返回值的命令
/// </summary>
/// <typeparam name="TResult">命令执行结果的类型</typeparam>
/// <param name="command">要执行的带返回值的命令对象</param>
/// <returns>命令执行的结果</returns>
Task<TResult> SendAsync<TResult>(IAsyncCommand<TResult> command);
}

View File

@ -0,0 +1,36 @@
namespace GFramework.Core.Abstractions.command;
/// <summary>
/// 定义命令执行器接口,提供同步和异步方式发送并执行命令的方法。
/// </summary>
public interface ICommandExecutor
{
/// <summary>
/// 发送并执行一个命令。
/// </summary>
/// <param name="command">要执行的命令对象,实现 ICommand 接口。</param>
public void Send(ICommand command);
/// <summary>
/// 发送并执行一个带返回值的命令。
/// </summary>
/// <typeparam name="TResult">命令执行结果的类型。</typeparam>
/// <param name="command">要执行的带返回值的命令对象,实现 ICommand&lt;TResult&gt; 接口。</param>
/// <returns>命令执行的结果,类型为 TResult。</returns>
public TResult Send<TResult>(ICommand<TResult> command);
/// <summary>
/// 发送并异步执行一个命令。
/// </summary>
/// <param name="command">要执行的命令对象,实现 IAsyncCommand 接口。</param>
/// <returns>表示异步操作的任务。</returns>
Task SendAsync(IAsyncCommand command);
/// <summary>
/// 发送并异步执行一个带返回值的命令。
/// </summary>
/// <typeparam name="TResult">命令执行结果的类型。</typeparam>
/// <param name="command">要执行的带返回值的命令对象,实现 IAsyncCommand&lt;TResult&gt; 接口。</param>
/// <returns>表示异步操作的任务,其结果为命令执行的结果,类型为 TResult。</returns>
Task<TResult> SendAsync<TResult>(IAsyncCommand<TResult> command);
}

View File

@ -1,15 +0,0 @@
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 异步查询总线接口,用于处理异步查询请求
/// </summary>
public interface IAsyncQueryBus
{
/// <summary>
/// 异步发送查询请求并返回结果
/// </summary>
/// <typeparam name="TResult">查询结果的类型</typeparam>
/// <param name="query">要执行的异步查询对象</param>
/// <returns>表示异步操作的任务,任务结果为查询结果</returns>
Task<TResult> SendAsync<TResult>(IAsyncQuery<TResult> query);
}

View File

@ -0,0 +1,16 @@
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 定义一个异步查询执行器接口,用于发送异步查询请求并获取结果。
/// </summary>
public interface IAsyncQueryExecutor
{
/// <summary>
/// 异步发送查询请求并返回结果。
/// </summary>
/// <typeparam name="TResult">查询结果的类型。</typeparam>
/// <param name="query">要执行的异步查询对象,必须实现 IAsyncQuery&lt;TResult&gt; 接口。</param>
/// <returns>表示异步操作的任务,任务完成时返回查询结果。</returns>
Task<TResult> SendAsync<TResult>(IAsyncQuery<TResult> query);
}

View File

@ -1,15 +0,0 @@
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 查询总线接口,用于发送和处理查询请求
/// </summary>
public interface IQueryBus
{
/// <summary>
/// 发送查询请求并返回结果
/// </summary>
/// <typeparam name="TResult">查询结果的类型</typeparam>
/// <param name="query">要发送的查询对象</param>
/// <returns>查询结果</returns>
public TResult Send<TResult>(IQuery<TResult> query);
}

View File

@ -0,0 +1,16 @@
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 定义一个查询执行器接口,用于发送查询请求并获取结果。
/// </summary>
public interface IQueryExecutor
{
/// <summary>
/// 发送查询请求并返回结果。
/// </summary>
/// <typeparam name="TResult">查询结果的类型。</typeparam>
/// <param name="query">要发送的查询对象,必须实现 IQuery&lt;TResult&gt; 接口。</param>
/// <returns>查询的结果,类型为 TResult。</returns>
TResult Send<TResult>(IQuery<TResult> query);
}

View File

@ -59,9 +59,9 @@ public class ArchitectureContextTests
// 创建服务实例 // 创建服务实例
_eventBus = new EventBus(); _eventBus = new EventBus();
_commandBus = new CommandBus(); _commandBus = new CommandExecutor();
_queryBus = new QueryBus(); _queryBus = new QueryExecutor();
_asyncQueryBus = new AsyncQueryBus(); _asyncQueryBus = new AsyncQueryExecutor();
_environment = new DefaultEnvironment(); _environment = new DefaultEnvironment();
// 将服务注册到容器 // 将服务注册到容器
@ -77,9 +77,9 @@ public class ArchitectureContextTests
private ArchitectureContext? _context; private ArchitectureContext? _context;
private IocContainer? _container; private IocContainer? _container;
private EventBus? _eventBus; private EventBus? _eventBus;
private CommandBus? _commandBus; private CommandExecutor? _commandBus;
private QueryBus? _queryBus; private QueryExecutor? _queryBus;
private AsyncQueryBus? _asyncQueryBus; private AsyncQueryExecutor? _asyncQueryBus;
private DefaultEnvironment? _environment; private DefaultEnvironment? _environment;
/// <summary> /// <summary>

View File

@ -21,7 +21,7 @@ namespace GFramework.Core.Tests.architecture;
/// ArchitectureServices类的单元测试 /// ArchitectureServices类的单元测试
/// 测试内容包括: /// 测试内容包括:
/// - 服务容器初始化 /// - 服务容器初始化
/// - 所有服务实例创建Container, EventBus, CommandBus, QueryBus /// - 所有服务实例创建Container, EventBus, CommandExecutor, QueryExecutor
/// - SetContext方法 - 设置上下文 /// - SetContext方法 - 设置上下文
/// - SetContext方法 - 重复设置上下文 /// - SetContext方法 - 重复设置上下文
/// - GetContext方法 - 获取已设置上下文 /// - GetContext方法 - 获取已设置上下文
@ -51,8 +51,8 @@ public class ArchitectureServicesTests
{ {
Assert.That(_services!.Container, Is.Not.Null); Assert.That(_services!.Container, Is.Not.Null);
Assert.That(_services.EventBus, Is.Not.Null); Assert.That(_services.EventBus, Is.Not.Null);
Assert.That(_services.CommandBus, Is.Not.Null); Assert.That(_services.CommandExecutor, Is.Not.Null);
Assert.That(_services.QueryBus, Is.Not.Null); Assert.That(_services.QueryExecutor, Is.Not.Null);
} }
[Test] [Test]
@ -78,8 +78,8 @@ public class ArchitectureServicesTests
[Test] [Test]
public void CommandBus_Should_Be_Instance_Of_CommandBus() public void CommandBus_Should_Be_Instance_Of_CommandBus()
{ {
Assert.That(_services!.CommandBus, Is.InstanceOf<ICommandBus>()); Assert.That(_services!.CommandExecutor, Is.InstanceOf<ICommandExecutor>());
Assert.That(_services.CommandBus, Is.InstanceOf<CommandBus>()); Assert.That(_services.CommandExecutor, Is.InstanceOf<CommandExecutor>());
} }
/// <summary> /// <summary>
@ -88,8 +88,8 @@ public class ArchitectureServicesTests
[Test] [Test]
public void QueryBus_Should_Be_Instance_Of_QueryBus() public void QueryBus_Should_Be_Instance_Of_QueryBus()
{ {
Assert.That(_services!.QueryBus, Is.InstanceOf<IQueryBus>()); Assert.That(_services!.QueryExecutor, Is.InstanceOf<IQueryExecutor>());
Assert.That(_services.QueryBus, Is.InstanceOf<QueryBus>()); Assert.That(_services.QueryExecutor, Is.InstanceOf<QueryExecutor>());
} }
/// <summary> /// <summary>
@ -198,7 +198,7 @@ public class ArchitectureServicesTests
var services1 = new ArchitectureServices(); var services1 = new ArchitectureServices();
var services2 = new ArchitectureServices(); var services2 = new ArchitectureServices();
Assert.That(services1.CommandBus, Is.Not.SameAs(services2.CommandBus)); Assert.That(services1.CommandExecutor, Is.Not.SameAs(services2.CommandExecutor));
} }
/// <summary> /// <summary>
@ -210,7 +210,7 @@ public class ArchitectureServicesTests
var services1 = new ArchitectureServices(); var services1 = new ArchitectureServices();
var services2 = new ArchitectureServices(); var services2 = new ArchitectureServices();
Assert.That(services1.QueryBus, Is.Not.SameAs(services2.QueryBus)); Assert.That(services1.QueryExecutor, Is.Not.SameAs(services2.QueryExecutor));
} }
} }
@ -224,8 +224,8 @@ public class TestArchitectureContextV3 : IArchitectureContext
public IIocContainer Container => _container; public IIocContainer Container => _container;
public IEventBus EventBus => new EventBus(); public IEventBus EventBus => new EventBus();
public ICommandBus CommandBus => new CommandBus(); public ICommandExecutor CommandExecutor => new CommandExecutor();
public IQueryBus QueryBus => new QueryBus(); public IQueryExecutor QueryExecutor => new QueryExecutor();
public TService? GetService<TService>() where TService : class public TService? GetService<TService>() where TService : class
{ {

View File

@ -244,12 +244,12 @@ public class TestArchitectureContext : IArchitectureContext
/// <summary> /// <summary>
/// 获取命令总线 /// 获取命令总线
/// </summary> /// </summary>
public ICommandBus CommandBus => new CommandBus(); public ICommandExecutor CommandExecutor => new CommandExecutor();
/// <summary> /// <summary>
/// 获取查询总线 /// 获取查询总线
/// </summary> /// </summary>
public IQueryBus QueryBus => new QueryBus(); public IQueryExecutor QueryExecutor => new QueryExecutor();
/// <summary> /// <summary>
/// 获取环境对象 /// 获取环境对象

View File

@ -34,10 +34,10 @@ public class AbstractAsyncCommandTests
{ {
_container = new IocContainer(); _container = new IocContainer();
_container.RegisterPlurality(new EventBus()); _container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandBus()); _container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryBus()); _container.RegisterPlurality(new QueryExecutor());
_container.RegisterPlurality(new DefaultEnvironment()); _container.RegisterPlurality(new DefaultEnvironment());
_container.RegisterPlurality(new AsyncQueryBus()); _container.RegisterPlurality(new AsyncQueryExecutor());
_context = new ArchitectureContext(_container); _context = new ArchitectureContext(_container);
} }

View File

@ -17,15 +17,15 @@ namespace GFramework.Core.Tests.command;
/// - SendAsync方法带返回值处理null异步命令 /// - SendAsync方法带返回值处理null异步命令
/// </summary> /// </summary>
[TestFixture] [TestFixture]
public class CommandBusTests public class CommandExecutorTests
{ {
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_commandBus = new CommandBus(); _commandExecutor = new CommandExecutor();
} }
private CommandBus _commandBus = null!; private CommandExecutor _commandExecutor = null!;
/// <summary> /// <summary>
/// 测试Send方法执行命令 /// 测试Send方法执行命令
@ -36,7 +36,7 @@ public class CommandBusTests
var input = new TestCommandInput { Value = 42 }; var input = new TestCommandInput { Value = 42 };
var command = new TestCommand(input); var command = new TestCommand(input);
Assert.DoesNotThrow(() => _commandBus.Send(command)); Assert.DoesNotThrow(() => _commandExecutor.Send(command));
Assert.That(command.Executed, Is.True); Assert.That(command.Executed, Is.True);
Assert.That(command.ExecutedValue, Is.EqualTo(42)); Assert.That(command.ExecutedValue, Is.EqualTo(42));
} }
@ -47,7 +47,7 @@ public class CommandBusTests
[Test] [Test]
public void Send_WithNullCommand_Should_ThrowArgumentNullException() public void Send_WithNullCommand_Should_ThrowArgumentNullException()
{ {
Assert.Throws<ArgumentNullException>(() => _commandBus.Send(null!)); Assert.Throws<ArgumentNullException>(() => _commandExecutor.Send(null!));
} }
/// <summary> /// <summary>
@ -59,7 +59,7 @@ public class CommandBusTests
var input = new TestCommandInput { Value = 100 }; var input = new TestCommandInput { Value = 100 };
var command = new TestCommandWithResult(input); var command = new TestCommandWithResult(input);
var result = _commandBus.Send(command); var result = _commandExecutor.Send(command);
Assert.That(command.Executed, Is.True); Assert.That(command.Executed, Is.True);
Assert.That(result, Is.EqualTo(200)); Assert.That(result, Is.EqualTo(200));
@ -71,7 +71,7 @@ public class CommandBusTests
[Test] [Test]
public void Send_WithResult_AndNullCommand_Should_ThrowArgumentNullException() public void Send_WithResult_AndNullCommand_Should_ThrowArgumentNullException()
{ {
Assert.Throws<ArgumentNullException>(() => _commandBus.Send<int>(null!)); Assert.Throws<ArgumentNullException>(() => _commandExecutor.Send<int>(null!));
} }
/// <summary> /// <summary>
@ -83,7 +83,7 @@ public class CommandBusTests
var input = new TestCommandInput { Value = 42 }; var input = new TestCommandInput { Value = 42 };
var command = new TestAsyncCommand(input); var command = new TestAsyncCommand(input);
await _commandBus.SendAsync(command); await _commandExecutor.SendAsync(command);
Assert.That(command.Executed, Is.True); Assert.That(command.Executed, Is.True);
Assert.That(command.ExecutedValue, Is.EqualTo(42)); Assert.That(command.ExecutedValue, Is.EqualTo(42));
@ -95,7 +95,7 @@ public class CommandBusTests
[Test] [Test]
public void SendAsync_WithNullCommand_Should_ThrowArgumentNullException() public void SendAsync_WithNullCommand_Should_ThrowArgumentNullException()
{ {
Assert.ThrowsAsync<ArgumentNullException>(async () => await _commandBus.SendAsync(null!)); Assert.ThrowsAsync<ArgumentNullException>(async () => await _commandExecutor.SendAsync(null!));
} }
/// <summary> /// <summary>
@ -107,7 +107,7 @@ public class CommandBusTests
var input = new TestCommandInput { Value = 100 }; var input = new TestCommandInput { Value = 100 };
var command = new TestAsyncCommandWithResult(input); var command = new TestAsyncCommandWithResult(input);
var result = await _commandBus.SendAsync(command); var result = await _commandExecutor.SendAsync(command);
Assert.That(command.Executed, Is.True); Assert.That(command.Executed, Is.True);
Assert.That(result, Is.EqualTo(200)); Assert.That(result, Is.EqualTo(200));
@ -119,7 +119,7 @@ public class CommandBusTests
[Test] [Test]
public void SendAsync_WithResult_AndNullCommand_Should_ThrowArgumentNullException() public void SendAsync_WithResult_AndNullCommand_Should_ThrowArgumentNullException()
{ {
Assert.ThrowsAsync<ArgumentNullException>(async () => await _commandBus.SendAsync<int>(null!)); Assert.ThrowsAsync<ArgumentNullException>(async () => await _commandExecutor.SendAsync<int>(null!));
} }
} }

View File

@ -32,10 +32,10 @@ public class AbstractAsyncQueryTests
{ {
_container = new IocContainer(); _container = new IocContainer();
_container.RegisterPlurality(new EventBus()); _container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandBus()); _container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryBus()); _container.RegisterPlurality(new QueryExecutor());
_container.RegisterPlurality(new DefaultEnvironment()); _container.RegisterPlurality(new DefaultEnvironment());
_container.RegisterPlurality(new AsyncQueryBus()); _container.RegisterPlurality(new AsyncQueryExecutor());
_context = new ArchitectureContext(_container); _context = new ArchitectureContext(_container);
} }

View File

@ -15,15 +15,15 @@ namespace GFramework.Core.Tests.query;
/// - 异步查询的上下文传递 /// - 异步查询的上下文传递
/// </summary> /// </summary>
[TestFixture] [TestFixture]
public class AsyncQueryBusTests public class AsyncQueryExecutorTests
{ {
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_asyncQueryBus = new AsyncQueryBus(); _asyncQueryExecutor = new AsyncQueryExecutor();
} }
private AsyncQueryBus _asyncQueryBus = null!; private AsyncQueryExecutor _asyncQueryExecutor = null!;
/// <summary> /// <summary>
/// 测试SendAsync方法正确返回查询结果 /// 测试SendAsync方法正确返回查询结果
@ -34,7 +34,7 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 10 }; var input = new TestAsyncQueryInput { Value = 10 };
var query = new TestAsyncQuery(input); var query = new TestAsyncQuery(input);
var result = await _asyncQueryBus.SendAsync(query); var result = await _asyncQueryExecutor.SendAsync(query);
Assert.That(result, Is.EqualTo(20)); Assert.That(result, Is.EqualTo(20));
} }
@ -45,7 +45,7 @@ public class AsyncQueryBusTests
[Test] [Test]
public void SendAsync_WithNullQuery_Should_ThrowArgumentNullException() public void SendAsync_WithNullQuery_Should_ThrowArgumentNullException()
{ {
Assert.ThrowsAsync<ArgumentNullException>(async () => await _asyncQueryBus.SendAsync<int>(null!)); Assert.ThrowsAsync<ArgumentNullException>(async () => await _asyncQueryExecutor.SendAsync<int>(null!));
} }
/// <summary> /// <summary>
@ -57,7 +57,7 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 5 }; var input = new TestAsyncQueryInput { Value = 5 };
var query = new TestAsyncStringQuery(input); var query = new TestAsyncStringQuery(input);
var result = await _asyncQueryBus.SendAsync(query); var result = await _asyncQueryExecutor.SendAsync(query);
Assert.That(result, Is.EqualTo("Result: 10")); Assert.That(result, Is.EqualTo("Result: 10"));
} }
@ -71,7 +71,7 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 42 }; var input = new TestAsyncQueryInput { Value = 42 };
var query = new TestAsyncBooleanQuery(input); var query = new TestAsyncBooleanQuery(input);
var result = await _asyncQueryBus.SendAsync(query); var result = await _asyncQueryExecutor.SendAsync(query);
Assert.That(result, Is.True); Assert.That(result, Is.True);
} }
@ -85,7 +85,7 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 100 }; var input = new TestAsyncQueryInput { Value = 100 };
var query = new TestAsyncComplexQuery(input); var query = new TestAsyncComplexQuery(input);
var result = await _asyncQueryBus.SendAsync(query); var result = await _asyncQueryExecutor.SendAsync(query);
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result.Value, Is.EqualTo(200)); Assert.That(result.Value, Is.EqualTo(200));
@ -101,7 +101,7 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 0 }; var input = new TestAsyncQueryInput { Value = 0 };
var query = new TestAsyncQueryWithException(input); var query = new TestAsyncQueryWithException(input);
Assert.ThrowsAsync<InvalidOperationException>(async () => await _asyncQueryBus.SendAsync(query)); Assert.ThrowsAsync<InvalidOperationException>(async () => await _asyncQueryExecutor.SendAsync(query));
} }
/// <summary> /// <summary>
@ -113,8 +113,8 @@ public class AsyncQueryBusTests
var input = new TestAsyncQueryInput { Value = 10 }; var input = new TestAsyncQueryInput { Value = 10 };
var query = new TestAsyncQuery(input); var query = new TestAsyncQuery(input);
var result1 = await _asyncQueryBus.SendAsync(query); var result1 = await _asyncQueryExecutor.SendAsync(query);
var result2 = await _asyncQueryBus.SendAsync(query); var result2 = await _asyncQueryExecutor.SendAsync(query);
Assert.That(result1, Is.EqualTo(20)); Assert.That(result1, Is.EqualTo(20));
Assert.That(result2, Is.EqualTo(20)); Assert.That(result2, Is.EqualTo(20));
@ -131,8 +131,8 @@ public class AsyncQueryBusTests
var query1 = new TestAsyncQuery(input1); var query1 = new TestAsyncQuery(input1);
var query2 = new TestAsyncQuery(input2); var query2 = new TestAsyncQuery(input2);
var result1 = await _asyncQueryBus.SendAsync(query1); var result1 = await _asyncQueryExecutor.SendAsync(query1);
var result2 = await _asyncQueryBus.SendAsync(query2); var result2 = await _asyncQueryExecutor.SendAsync(query2);
Assert.That(result1, Is.EqualTo(20)); Assert.That(result1, Is.EqualTo(20));
Assert.That(result2, Is.EqualTo(40)); Assert.That(result2, Is.EqualTo(40));

View File

@ -8,7 +8,7 @@ namespace GFramework.Core.Tests.query;
/// 查询总线测试类用于测试QueryBus的功能和异常处理 /// 查询总线测试类用于测试QueryBus的功能和异常处理
/// </summary> /// </summary>
[TestFixture] [TestFixture]
public class QueryBusTests public class QueryExecutorTests
{ {
/// <summary> /// <summary>
/// 测试设置方法,在每个测试方法执行前初始化查询总线实例 /// 测试设置方法,在每个测试方法执行前初始化查询总线实例
@ -16,10 +16,10 @@ public class QueryBusTests
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_queryBus = new QueryBus(); _queryExecutor = new QueryExecutor();
} }
private QueryBus _queryBus = null!; private QueryExecutor _queryExecutor = null!;
/// <summary> /// <summary>
/// 测试Send方法是否能正确返回查询结果 /// 测试Send方法是否能正确返回查询结果
@ -31,7 +31,7 @@ public class QueryBusTests
var input = new TestQueryInput { Value = 10 }; var input = new TestQueryInput { Value = 10 };
var query = new TestQuery(input); var query = new TestQuery(input);
var result = _queryBus.Send(query); var result = _queryExecutor.Send(query);
Assert.That(result, Is.EqualTo(20)); Assert.That(result, Is.EqualTo(20));
} }
@ -43,7 +43,7 @@ public class QueryBusTests
[Test] [Test]
public void Send_WithNullQuery_Should_ThrowArgumentNullException() public void Send_WithNullQuery_Should_ThrowArgumentNullException()
{ {
Assert.Throws<ArgumentNullException>(() => _queryBus.Send<int>(null!)); Assert.Throws<ArgumentNullException>(() => _queryExecutor.Send<int>(null!));
} }
/// <summary> /// <summary>
@ -56,7 +56,7 @@ public class QueryBusTests
var input = new TestQueryInput { Value = 5 }; var input = new TestQueryInput { Value = 5 };
var query = new TestStringQuery(input); var query = new TestStringQuery(input);
var result = _queryBus.Send(query); var result = _queryExecutor.Send(query);
Assert.That(result, Is.EqualTo("Result: 10")); Assert.That(result, Is.EqualTo("Result: 10"));
} }

View File

@ -50,10 +50,10 @@ public class StateMachineSystemTests
LoggerFactoryResolver.Provider.CreateLogger(nameof(StateMachineSystemTests))); LoggerFactoryResolver.Provider.CreateLogger(nameof(StateMachineSystemTests)));
container.RegisterPlurality(_eventBus); container.RegisterPlurality(_eventBus);
container.RegisterPlurality(new CommandBus()); container.RegisterPlurality(new CommandExecutor());
container.RegisterPlurality(new QueryBus()); container.RegisterPlurality(new QueryExecutor());
container.RegisterPlurality(new DefaultEnvironment()); container.RegisterPlurality(new DefaultEnvironment());
container.RegisterPlurality(new AsyncQueryBus()); container.RegisterPlurality(new AsyncQueryExecutor());
_context = new ArchitectureContext(container); _context = new ArchitectureContext(container);

View File

@ -32,10 +32,10 @@ public class AbstractContextUtilityTests
{ {
_container = new IocContainer(); _container = new IocContainer();
_container.RegisterPlurality(new EventBus()); _container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandBus()); _container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryBus()); _container.RegisterPlurality(new QueryExecutor());
_container.RegisterPlurality(new DefaultEnvironment()); _container.RegisterPlurality(new DefaultEnvironment());
_container.RegisterPlurality(new AsyncQueryBus()); _container.RegisterPlurality(new AsyncQueryExecutor());
_context = new ArchitectureContext(_container); _context = new ArchitectureContext(_container);
} }

View File

@ -61,8 +61,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public TResult SendQuery<TResult>(IQuery<TResult> query) public TResult SendQuery<TResult>(IQuery<TResult> query)
{ {
if (query == null) throw new ArgumentNullException(nameof(query)); if (query == null) throw new ArgumentNullException(nameof(query));
var queryBus = GetOrCache<IQueryBus>(); var queryBus = GetOrCache<IQueryExecutor>();
if (queryBus == null) throw new InvalidOperationException("IQueryBus not registered"); if (queryBus == null) throw new InvalidOperationException("IQueryExecutor not registered");
return queryBus.Send(query); return queryBus.Send(query);
} }
@ -75,8 +75,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public async Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query) public async Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query)
{ {
if (query == null) throw new ArgumentNullException(nameof(query)); if (query == null) throw new ArgumentNullException(nameof(query));
var asyncQueryBus = GetOrCache<IAsyncQueryBus>(); var asyncQueryBus = GetOrCache<IAsyncQueryExecutor>();
if (asyncQueryBus == null) throw new InvalidOperationException("IAsyncQueryBus not registered"); if (asyncQueryBus == null) throw new InvalidOperationException("IAsyncQueryExecutor not registered");
return await asyncQueryBus.SendAsync(query); return await asyncQueryBus.SendAsync(query);
} }
@ -125,7 +125,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public void SendCommand(ICommand command) public void SendCommand(ICommand command)
{ {
ArgumentNullException.ThrowIfNull(command); ArgumentNullException.ThrowIfNull(command);
var commandBus = GetOrCache<ICommandBus>(); var commandBus = GetOrCache<ICommandExecutor>();
commandBus?.Send(command); commandBus?.Send(command);
} }
@ -138,8 +138,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public TResult SendCommand<TResult>(ICommand<TResult> command) public TResult SendCommand<TResult>(ICommand<TResult> command)
{ {
ArgumentNullException.ThrowIfNull(command); ArgumentNullException.ThrowIfNull(command);
var commandBus = GetOrCache<ICommandBus>(); var commandBus = GetOrCache<ICommandExecutor>();
if (commandBus == null) throw new InvalidOperationException("ICommandBus not registered"); if (commandBus == null) throw new InvalidOperationException("ICommandExecutor not registered");
return commandBus.Send(command); return commandBus.Send(command);
} }
@ -150,8 +150,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public async Task SendCommandAsync(IAsyncCommand command) public async Task SendCommandAsync(IAsyncCommand command)
{ {
ArgumentNullException.ThrowIfNull(command); ArgumentNullException.ThrowIfNull(command);
var commandBus = GetOrCache<ICommandBus>(); var commandBus = GetOrCache<ICommandExecutor>();
if (commandBus == null) throw new InvalidOperationException("ICommandBus not registered"); if (commandBus == null) throw new InvalidOperationException("ICommandExecutor not registered");
await commandBus.SendAsync(command); await commandBus.SendAsync(command);
} }
@ -164,8 +164,8 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext
public async Task<TResult> SendCommandAsync<TResult>(IAsyncCommand<TResult> command) public async Task<TResult> SendCommandAsync<TResult>(IAsyncCommand<TResult> command)
{ {
ArgumentNullException.ThrowIfNull(command); ArgumentNullException.ThrowIfNull(command);
var commandBus = GetOrCache<ICommandBus>(); var commandBus = GetOrCache<ICommandExecutor>();
if (commandBus == null) throw new InvalidOperationException("ICommandBus not registered"); if (commandBus == null) throw new InvalidOperationException("ICommandExecutor not registered");
return await commandBus.SendAsync(command); return await commandBus.SendAsync(command);
} }

View File

@ -7,7 +7,6 @@ using GFramework.Core.command;
using GFramework.Core.events; using GFramework.Core.events;
using GFramework.Core.ioc; using GFramework.Core.ioc;
using GFramework.Core.query; using GFramework.Core.query;
using IAsyncQueryBus = GFramework.Core.Abstractions.query.IAsyncQueryBus;
namespace GFramework.Core.architecture; namespace GFramework.Core.architecture;
@ -19,12 +18,12 @@ public class ArchitectureServices : IArchitectureServices
/// <summary> /// <summary>
/// 异步查询总线实例 /// 异步查询总线实例
/// </summary> /// </summary>
private readonly IAsyncQueryBus _asyncQueryBus; private readonly IAsyncQueryExecutor _asyncQueryExecutor;
/// <summary> /// <summary>
/// 命令总线实例 /// 命令执行器实例
/// </summary> /// </summary>
private readonly ICommandBus _commandBus; private readonly ICommandExecutor _commandExecutor;
/// <summary> /// <summary>
/// 事件总线实例 /// 事件总线实例
@ -32,14 +31,19 @@ public class ArchitectureServices : IArchitectureServices
private readonly IEventBus _eventBus; private readonly IEventBus _eventBus;
/// <summary> /// <summary>
/// 查询总线实例 /// 同步查询执行器实例
/// </summary> /// </summary>
private readonly IQueryBus _queryBus; private readonly IQueryExecutor _queryExecutor;
/// <summary>
/// 架构上下文对象
/// </summary>
private IArchitectureContext _context = null!; private IArchitectureContext _context = null!;
/// <summary> /// <summary>
/// 构造函数,初始化架构服务 /// 构造函数,初始化架构服务
/// 初始化依赖注入容器,并创建事件总线、命令执行器、查询执行器和异步查询执行器的实例,
/// 然后将这些服务注册到容器中。
/// </summary> /// </summary>
public ArchitectureServices() public ArchitectureServices()
{ {
@ -47,15 +51,15 @@ public class ArchitectureServices : IArchitectureServices
// 创建服务实例 // 创建服务实例
_eventBus = new EventBus(); _eventBus = new EventBus();
_commandBus = new CommandBus(); _commandExecutor = new CommandExecutor();
_queryBus = new QueryBus(); _queryExecutor = new QueryExecutor();
_asyncQueryBus = new AsyncQueryBus(); _asyncQueryExecutor = new AsyncQueryExecutor();
// 将服务注册到容器 // 将服务注册到容器
Container.RegisterPlurality(_eventBus); Container.RegisterPlurality(_eventBus);
Container.RegisterPlurality(_commandBus); Container.RegisterPlurality(_commandExecutor);
Container.RegisterPlurality(_queryBus); Container.RegisterPlurality(_queryExecutor);
Container.RegisterPlurality(_asyncQueryBus); Container.RegisterPlurality(_asyncQueryExecutor);
} }
/// <summary> /// <summary>
@ -64,24 +68,24 @@ public class ArchitectureServices : IArchitectureServices
public IIocContainer Container { get; } public IIocContainer Container { get; }
/// <summary> /// <summary>
/// 获取类型事件系统 /// 获取事件总线实例
/// </summary> /// </summary>
public IEventBus EventBus => _eventBus; public IEventBus EventBus => _eventBus;
/// <summary> /// <summary>
/// 获取命令总线 /// 获取命令执行器实例
/// </summary> /// </summary>
public ICommandBus CommandBus => _commandBus; public ICommandExecutor CommandExecutor => _commandExecutor;
/// <summary> /// <summary>
/// 获取查询总线 /// 获取同步查询执行器实例
/// </summary> /// </summary>
public IQueryBus QueryBus => _queryBus; public IQueryExecutor QueryExecutor => _queryExecutor;
/// <summary> /// <summary>
/// 获取异步查询总线 /// 获取异步查询执行器实例
/// </summary> /// </summary>
public IAsyncQueryBus AsyncQueryBus => _asyncQueryBus; public IAsyncQueryExecutor AsyncQueryExecutor => _asyncQueryExecutor;
/// <summary> /// <summary>
/// 设置架构上下文 /// 设置架构上下文
@ -101,4 +105,4 @@ public class ArchitectureServices : IArchitectureServices
{ {
return _context; return _context;
} }
} }

View File

@ -4,9 +4,10 @@ using IAsyncCommand = GFramework.Core.Abstractions.command.IAsyncCommand;
namespace GFramework.Core.command; namespace GFramework.Core.command;
/// <summary> /// <summary>
/// 命令总线实现类,用于发送和执行命令 /// 表示一个命令执行器,用于执行命令操作。
/// 该类实现了 ICommandExecutor 接口,提供命令执行的核心功能。
/// </summary> /// </summary>
public sealed class CommandBus : ICommandBus public sealed class CommandExecutor : ICommandExecutor
{ {
/// <summary> /// <summary>
/// 发送并执行无返回值的命令 /// 发送并执行无返回值的命令

View File

@ -5,7 +5,7 @@ namespace GFramework.Core.query;
/// <summary> /// <summary>
/// 异步查询总线实现,用于处理异步查询请求 /// 异步查询总线实现,用于处理异步查询请求
/// </summary> /// </summary>
public sealed class AsyncQueryBus : IAsyncQueryBus public sealed class AsyncQueryExecutor : IAsyncQueryExecutor
{ {
/// <summary> /// <summary>
/// 异步发送查询请求并返回结果 /// 异步发送查询请求并返回结果

View File

@ -1,23 +0,0 @@
using GFramework.Core.Abstractions.query;
namespace GFramework.Core.query;
/// <summary>
/// 查询总线实现,负责执行查询并返回结果
/// </summary>
public sealed class QueryBus : IQueryBus
{
/// <summary>
/// 执行指定的查询并返回结果
/// </summary>
/// <typeparam name="TResult">查询结果的类型</typeparam>
/// <param name="query">要执行的查询对象</param>
/// <returns>查询执行结果</returns>
public TResult Send<TResult>(IQuery<TResult> query)
{
// 验证查询参数不为null
ArgumentNullException.ThrowIfNull(query);
return query.Do();
}
}

View File

@ -0,0 +1,27 @@
using GFramework.Core.Abstractions.query;
namespace GFramework.Core.query;
/// <summary>
/// QueryExecutor 类负责执行查询操作,实现 IQueryExecutor 接口。
/// 该类是密封的,防止被继承。
/// </summary>
public sealed class QueryExecutor : IQueryExecutor
{
/// <summary>
/// 执行指定的查询并返回结果。
/// 该方法通过调用查询对象的 Do 方法来获取结果。
/// </summary>
/// <typeparam name="TResult">查询结果的类型。</typeparam>
/// <param name="query">要执行的查询对象,必须实现 IQuery&lt;TResult&gt; 接口。</param>
/// <returns>查询执行的结果,类型为 TResult。</returns>
public TResult Send<TResult>(IQuery<TResult> query)
{
// 验证查询参数不为 null如果为 null 则抛出 ArgumentNullException 异常
ArgumentNullException.ThrowIfNull(query);
// 调用查询对象的 Do 方法执行查询并返回结果
return query.Do();
}
}