// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using GFramework.Core.Abstractions.Query;
using GFramework.Core.Cqrs;
using GFramework.Cqrs.Abstractions.Cqrs;
namespace GFramework.Core.Query;
///
/// 异步查询总线实现,用于处理异步查询请求
///
public sealed class AsyncQueryExecutor(ICqrsRuntime? runtime = null) : IAsyncQueryExecutor
{
private readonly ICqrsRuntime? _runtime = runtime;
///
/// 获取当前执行器是否已接入统一 CQRS runtime。
///
public bool UsesCqrsRuntime => _runtime is not null;
///
/// 异步发送查询请求并返回结果
///
/// 查询结果类型
/// 要执行的异步查询对象
/// 包含查询结果的异步任务
public Task SendAsync(IAsyncQuery query)
{
ArgumentNullException.ThrowIfNull(query);
var cqrsRuntime = _runtime;
if (LegacyCqrsDispatchHelper.TryResolveDispatchContext(cqrsRuntime, query, out var context))
{
return BridgeAsyncQueryAsync(cqrsRuntime, context, query);
}
return query.DoAsync();
}
///
/// 通过统一 CQRS runtime 异步执行 legacy 查询,并把装箱结果还原为目标类型。
///
/// 查询结果类型。
/// 负责调度当前 bridge request 的统一 CQRS runtime。
/// 当前架构上下文。
/// 要桥接的 legacy 查询。
/// 查询执行结果。
private static async Task BridgeAsyncQueryAsync(
ICqrsRuntime runtime,
GFramework.Core.Abstractions.Architectures.IArchitectureContext context,
IAsyncQuery query)
{
var boxedResult = await runtime.SendAsync(
context,
new LegacyAsyncQueryDispatchRequest(
query,
async () => await query.DoAsync().ConfigureAwait(false)))
.ConfigureAwait(false);
return (TResult)boxedResult!;
}
}