refactor: SimApiRequestDelegateFactory/SimApiResultWriter 从 extensions 移到 helpers
- 包 simapi.extensions → simapi.helpers - 新增 interfaces/IBindRequestContext 接口切断 helpers↔controllers 循环依赖 (工厂只依赖接口,不再依赖 SimApiBaseController) - SimApiAuth 注解类与 helpers.SimApiAuth 同名冲突,用 import 别名 SimApiAuthAttribute 解决
This commit is contained in:
@@ -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)。
|
||||
*/
|
||||
|
||||
+6
-7
@@ -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# 项目 SimApi(E:\simcu\simapi-net),遵循 MIT 许可证。
|
||||
*/
|
||||
|
||||
package simapi.extensions
|
||||
package simapi.helpers
|
||||
|
||||
import soulsoft_web_http.*
|
||||
import soulsoft_web_mvc.core.*
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user