refactor: SimApiRequestDelegateFactory/SimApiResultWriter 从 extensions 移到 helpers

- 包 simapi.extensions → simapi.helpers
- 新增 interfaces/IBindRequestContext 接口切断 helpers↔controllers 循环依赖
  (工厂只依赖接口,不再依赖 SimApiBaseController)
- SimApiAuth 注解类与 helpers.SimApiAuth 同名冲突,用 import 别名 SimApiAuthAttribute 解决
This commit is contained in:
2026-08-17 09:12:47 +08:00
parent ff41d287ed
commit bcac7b1102
4 changed files with 33 additions and 9 deletions
+2 -1
View File
@@ -11,12 +11,13 @@ import soulsoft_web_http.*
import soulsoft_web_mvc.core.* import soulsoft_web_mvc.core.*
import simapi.communications.* import simapi.communications.*
import simapi.helpers.* import simapi.helpers.*
import simapi.interfaces.*
/** /**
* 基础控制器:所有控制器均继承本控制器。 * 基础控制器:所有控制器均继承本控制器。
* 对齐 C# 的 SimApiBaseController[Consumes]/[Produces] JSON + 登录信息)。 * 对齐 C# 的 SimApiBaseController[Consumes]/[Produces] JSON + 登录信息)。
*/ */
public open class SimApiBaseController <: Controller { public open class SimApiBaseController <: Controller & IBindRequestContext {
/** /**
* 当前登录信息(需 EnableSimApiAuth;未登录抛 401)。 * 当前登录信息(需 EnableSimApiAuth;未登录抛 401)。
*/ */
@@ -11,7 +11,7 @@
* 注册方式:必须在 soulsoft addControllers() 之前注册(tryAddSingleton 先到先得)。 * 注册方式:必须在 soulsoft addControllers() 之前注册(tryAddSingleton 先到先得)。
*/ */
package simapi.extensions package simapi.helpers
import std.collection.* import std.collection.*
import std.reflect.* import std.reflect.*
@@ -23,11 +23,9 @@ import soulsoft_web_mvc.modelBindings.*
import soulsoft_web_mvc.abstractions.* import soulsoft_web_mvc.abstractions.*
import soulsoft_extensions_options.* import soulsoft_extensions_options.*
import soulsoft_extensions_injection.* import soulsoft_extensions_injection.*
import simapi.attributes.{SimApiAuth, OriginResponse} import simapi.attributes.{SimApiAuth as SimApiAuthAttribute, OriginResponse}
import simapi.communications.* import simapi.communications.*
import simapi.configurations.* import simapi.configurations.*
import simapi.controllers.*
import simapi.helpers.{SimApiError}
import simapi.interfaces.* import simapi.interfaces.*
/** /**
@@ -75,9 +73,9 @@ struct SimApiActionInvoker {
/// 检查 @SimApiAuth 注解并执行鉴权(对齐 C# SimApiAuthAttribute.OnActionExecuting): /// 检查 @SimApiAuth 注解并执行鉴权(对齐 C# SimApiAuthAttribute.OnActionExecuting):
/// 未登录 401 → 类型权限 403 → 遍历执行 ISimApiAuthChecker /// 未登录 401 → 类型权限 403 → 遍历执行 ISimApiAuthChecker
private func checkSimApiAuth() { private func checkSimApiAuth() {
var auth: ?SimApiAuth = None var auth: ?SimApiAuthAttribute = None
for (item in actionDescriptor.endpointMetadata) { for (item in actionDescriptor.endpointMetadata) {
if (let a: SimApiAuth <- item) { if (let a: SimApiAuthAttribute <- item) {
auth = Some(a) auth = Some(a)
break break
} }
@@ -196,9 +194,10 @@ struct SimApiActionInvoker {
} }
/// 通过 DI 容器实例化控制器,并注入当前 HttpContext /// 通过 DI 容器实例化控制器,并注入当前 HttpContext
/// (通过 IBindRequestContext 接口而非 SimApiBaseController,避免 helpers↔controllers 循环依赖)
private func createControllerInstance(): Object { private func createControllerInstance(): Object {
let instance = ActivatorUtilities.createInstance(context.services, actionDescriptor.controllerType) let instance = ActivatorUtilities.createInstance(context.services, actionDescriptor.controllerType)
if (let controller: SimApiBaseController <- instance) { if (let controller: IBindRequestContext <- instance) {
controller.bindRequestContext(context) controller.bindRequestContext(context)
} }
return instance return instance
@@ -3,7 +3,7 @@
* 移植自 C# 项目 SimApiE:\simcu\simapi-net),遵循 MIT 许可证。 * 移植自 C# 项目 SimApiE:\simcu\simapi-net),遵循 MIT 许可证。
*/ */
package simapi.extensions package simapi.helpers
import soulsoft_web_http.* import soulsoft_web_http.*
import soulsoft_web_mvc.core.* import soulsoft_web_mvc.core.*
+24
View File
@@ -0,0 +1,24 @@
/*
* Copyright (c) 2025 SimcuTeam. All rights reserved.
* 移植自 C# 项目 SimApiE:\simcu\simapi-net),遵循 MIT 许可证。
* Interfaces/IBindRequestContext:请求上下文绑定接口。
*
* 说明:SimApiBaseController 实现本接口,由 SimApiRequestDelegateFactorysimapi.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
}