// 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(); } }