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 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)。
|
||||||
*/
|
*/
|
||||||
|
|||||||
+6
-7
@@ -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# 项目 SimApi(E:\simcu\simapi-net),遵循 MIT 许可证。
|
* 移植自 C# 项目 SimApi(E:\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.*
|
||||||
@@ -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