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 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)。
*/
@@ -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
@@ -3,7 +3,7 @@
* 移植自 C# 项目 SimApiE:\simcu\simapi-net),遵循 MIT 许可证。
*/
package simapi.extensions
package simapi.helpers
import soulsoft_web_http.*
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
}