From bcac7b1102f24bcb8357bb345e0ec55e6b012d3f Mon Sep 17 00:00:00 2001 From: xRain Date: Mon, 17 Aug 2026 09:12:47 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20SimApiRequestDelegateFactory/SimApi?= =?UTF-8?q?ResultWriter=20=E4=BB=8E=20extensions=20=E7=A7=BB=E5=88=B0=20he?= =?UTF-8?q?lpers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 包 simapi.extensions → simapi.helpers - 新增 interfaces/IBindRequestContext 接口切断 helpers↔controllers 循环依赖 (工厂只依赖接口,不再依赖 SimApiBaseController) - SimApiAuth 注解类与 helpers.SimApiAuth 同名冲突,用 import 别名 SimApiAuthAttribute 解决 --- src/controllers/SimApiBaseController.cj | 3 ++- .../SimApiRequestDelegateFactory.cj | 13 +++++----- .../SimApiResultWriter.cj | 2 +- src/interfaces/IBindRequestContext.cj | 24 +++++++++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) rename src/{extensions => helpers}/SimApiRequestDelegateFactory.cj (95%) rename src/{extensions => helpers}/SimApiResultWriter.cj (98%) create mode 100644 src/interfaces/IBindRequestContext.cj diff --git a/src/controllers/SimApiBaseController.cj b/src/controllers/SimApiBaseController.cj index 069759f..be9ea67 100644 --- a/src/controllers/SimApiBaseController.cj +++ b/src/controllers/SimApiBaseController.cj @@ -11,12 +11,13 @@ import soulsoft_web_http.* import soulsoft_web_mvc.core.* import simapi.communications.* import simapi.helpers.* +import simapi.interfaces.* /** * 基础控制器:所有控制器均继承本控制器。 * 对齐 C# 的 SimApiBaseController([Consumes]/[Produces] JSON + 登录信息)。 */ -public open class SimApiBaseController <: Controller { +public open class SimApiBaseController <: Controller & IBindRequestContext { /** * 当前登录信息(需 EnableSimApiAuth;未登录抛 401)。 */ diff --git a/src/extensions/SimApiRequestDelegateFactory.cj b/src/helpers/SimApiRequestDelegateFactory.cj similarity index 95% rename from src/extensions/SimApiRequestDelegateFactory.cj rename to src/helpers/SimApiRequestDelegateFactory.cj index 80673c3..edf508d 100644 --- a/src/extensions/SimApiRequestDelegateFactory.cj +++ b/src/helpers/SimApiRequestDelegateFactory.cj @@ -11,7 +11,7 @@ * 注册方式:必须在 soulsoft addControllers() 之前注册(tryAddSingleton 先到先得)。 */ -package simapi.extensions +package simapi.helpers import std.collection.* import std.reflect.* @@ -23,11 +23,9 @@ import soulsoft_web_mvc.modelBindings.* import soulsoft_web_mvc.abstractions.* import soulsoft_extensions_options.* import soulsoft_extensions_injection.* -import simapi.attributes.{SimApiAuth, OriginResponse} +import simapi.attributes.{SimApiAuth as SimApiAuthAttribute, OriginResponse} import simapi.communications.* import simapi.configurations.* -import simapi.controllers.* -import simapi.helpers.{SimApiError} import simapi.interfaces.* /** @@ -75,9 +73,9 @@ struct SimApiActionInvoker { /// 检查 @SimApiAuth 注解并执行鉴权(对齐 C# SimApiAuthAttribute.OnActionExecuting): /// 未登录 401 → 类型权限 403 → 遍历执行 ISimApiAuthChecker private func checkSimApiAuth() { - var auth: ?SimApiAuth = None + var auth: ?SimApiAuthAttribute = None for (item in actionDescriptor.endpointMetadata) { - if (let a: SimApiAuth <- item) { + if (let a: SimApiAuthAttribute <- item) { auth = Some(a) break } @@ -196,9 +194,10 @@ struct SimApiActionInvoker { } /// 通过 DI 容器实例化控制器,并注入当前 HttpContext + /// (通过 IBindRequestContext 接口而非 SimApiBaseController,避免 helpers↔controllers 循环依赖) private func createControllerInstance(): Object { let instance = ActivatorUtilities.createInstance(context.services, actionDescriptor.controllerType) - if (let controller: SimApiBaseController <- instance) { + if (let controller: IBindRequestContext <- instance) { controller.bindRequestContext(context) } return instance diff --git a/src/extensions/SimApiResultWriter.cj b/src/helpers/SimApiResultWriter.cj similarity index 98% rename from src/extensions/SimApiResultWriter.cj rename to src/helpers/SimApiResultWriter.cj index 9416a3a..a9cdf45 100644 --- a/src/extensions/SimApiResultWriter.cj +++ b/src/helpers/SimApiResultWriter.cj @@ -3,7 +3,7 @@ * 移植自 C# 项目 SimApi(E:\simcu\simapi-net),遵循 MIT 许可证。 */ -package simapi.extensions +package simapi.helpers import soulsoft_web_http.* import soulsoft_web_mvc.core.* diff --git a/src/interfaces/IBindRequestContext.cj b/src/interfaces/IBindRequestContext.cj new file mode 100644 index 0000000..31516f7 --- /dev/null +++ b/src/interfaces/IBindRequestContext.cj @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 SimcuTeam. All rights reserved. + * 移植自 C# 项目 SimApi(E:\simcu\simapi-net),遵循 MIT 许可证。 + * Interfaces/IBindRequestContext:请求上下文绑定接口。 + * + * 说明:SimApiBaseController 实现本接口,由 SimApiRequestDelegateFactory(simapi.helpers) + * 在创建控制器后注入当前 HttpContext。放在 interfaces 包是为了避免 + * simapi.helpers → simapi.controllers 的循环依赖(controllers 依赖 helpers 的 SimApiError/SimApiAuth/SimApiUtil)。 + */ + +package simapi.interfaces + +import soulsoft_web_http.* + +/** + * 请求上下文绑定接口:控制器实现后,框架在派发请求时把当前 HttpContext 注入。 + */ +public interface IBindRequestContext { + /** + * 绑定当前请求上下文。 + * @param context 当前请求的 HttpContext。 + */ + func bindRequestContext(context: HttpContext): Unit +}