// 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!; } }