using System;
namespace Apewer.Web
{
/// WebAPI 控制器基类。
/// 控制器具有 Independent 特性时,不匹配 Function,且忽略 Initializer 返回值。
public abstract class ApiController
{
internal Func _func = null;
internal Action _action = null;
internal Action _default = null;
internal ApiOptions _options = null;
/// 获取 API 请求模型。
public ApiRequest Request { get; internal set; }
/// 获取 API 响应模型。
public ApiResponse Response { get; internal set; }
/// 创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。
/// 初始化程序。当返回 False 时等同于声明 Independent,将不再匹配 Function 和 Default。
/// 在匹配 Function 且失败后执行的方法。
/// 执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose
public ApiController(Func initializer = null, Action @default = null)
{
_func = initializer;
_default = @default;
}
/// 创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。
/// 初始化程序。
/// 在匹配 Function 且失败后执行的方法。
/// 执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose
public ApiController(Action initializer, Action @default = null)
{
_func = (c) =>
{
initializer?.Invoke(this);
return true;
};
_default = @default;
}
}
/// WebAPI 控制器基类。
/// 控制器具有 Independent 特性时,不匹配 Function,且忽略 Initializer 返回值。
public abstract class ApiController : ApiController where T : ApiController
{
static Func ToBaseFunc(Func current)
{
if (current == null) return null;
return new Func(c => current.Invoke((T)c));
}
static Action ToBaseAction(Action current)
{
if (current == null) return null;
return new Action(c => current.Invoke((T)c));
}
/// 创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。
/// 初始化程序。当返回 False 时等同于声明 Independent,将不再匹配 Function 和 Default。
/// 在匹配 Function 且失败后执行的方法。
/// 执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose
public ApiController(Func initializer = null, Action @default = null) : base(ToBaseFunc(initializer), ToBaseAction(@default)) { }
/// 创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。
/// 初始化程序。
/// 在匹配 Function 且失败后执行的方法。
/// 执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose
public ApiController(Action initializer, Action @default = null) : base(ToBaseAction(initializer), ToBaseAction(@default)) { }
}
}