// 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;
///
/// QueryExecutor 类负责执行查询操作,实现 IQueryExecutor 接口。
/// 该类是密封的,防止被继承。
///
public sealed class QueryExecutor(ICqrsRuntime? runtime = null) : IQueryExecutor
{
private readonly ICqrsRuntime? _runtime = runtime;
///
/// 获取当前执行器是否已接入统一 CQRS runtime。
///
public bool UsesCqrsRuntime => _runtime is not null;
///
/// 执行指定的查询并返回结果。
/// 当查询对象携带可用的架构上下文且执行器已接入统一 runtime 时,
/// 该方法会先把 legacy 查询包装成内部 request 并交给 ,
/// 以复用统一的 dispatch / pipeline 入口;否则回退到 legacy 直接执行。
///
/// 查询结果的类型。
/// 要执行的查询对象,必须实现 IQuery<TResult> 接口。
/// 查询执行成功后还原出的 结果。
///
/// 统一 CQRS runtime 返回 ,但 为值类型。
///
///
/// 统一 CQRS runtime 返回的装箱结果无法转换为 。
///
public TResult Send(IQuery query)
{
ArgumentNullException.ThrowIfNull(query);
var cqrsRuntime = _runtime;
if (LegacyCqrsDispatchHelper.TryResolveDispatchContext(cqrsRuntime, query, out var context))
{
var boxedResult = LegacyCqrsDispatchHelper.SendSynchronously(
cqrsRuntime,
context,
new LegacyQueryDispatchRequest(
query,
() => query.Do()));
return (TResult)boxedResult!;
}
return query.Do();
}
}