You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
4.0 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. using System;
  2. namespace Apewer.Web
  3. {
  4. /// <summary>WebAPI 控制器基类。</summary>
  5. /// <remarks>控制器具有 Independent 特性时,不匹配 Function,且忽略 Initializer 返回值。</remarks>
  6. public abstract class ApiController
  7. {
  8. internal ApiContext _context = null;
  9. internal Func<ApiController, bool> _func = null;
  10. internal Action<ApiController> _action = null;
  11. internal Action<ApiController> _default = null;
  12. internal ApiOptions _options = null;
  13. /// <summary>获取 API 上下文。</summary>
  14. public virtual ApiContext Context { get => _context; }
  15. /// <summary>获取 API 请求模型。</summary>
  16. public virtual ApiRequest Request { get => _context?.Request; }
  17. /// <summary>获取 API 响应模型。</summary>
  18. public virtual ApiResponse Response { get => _context?.Response; }
  19. /// <summary>创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。</summary>
  20. /// <param name="initializer">初始化程序。当返回 False 时等同于声明 Independent,将不再匹配 Function 和 Default。</param>
  21. /// <param name="default">在匹配 Function 且失败后执行的方法。</param>
  22. /// <remarks>执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose</remarks>
  23. public ApiController(Func<ApiController, bool> initializer = null, Action<ApiController> @default = null)
  24. {
  25. _func = initializer;
  26. _default = @default;
  27. }
  28. /// <summary>创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。</summary>
  29. /// <param name="initializer">初始化程序。</param>
  30. /// <param name="default">在匹配 Function 且失败后执行的方法。</param>
  31. /// <remarks>执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose</remarks>
  32. public ApiController(Action<ApiController> initializer, Action<ApiController> @default = null)
  33. {
  34. _func = (c) =>
  35. {
  36. initializer?.Invoke(this);
  37. return true;
  38. };
  39. _default = @default;
  40. }
  41. }
  42. /// <summary>WebAPI 控制器基类。</summary>
  43. /// <remarks>控制器具有 Independent 特性时,不匹配 Function,且忽略 Initializer 返回值。</remarks>
  44. public abstract class ApiController<T> : ApiController where T : ApiController
  45. {
  46. static Func<ApiController, bool> ToBaseFunc(Func<T, bool> current)
  47. {
  48. if (current == null) return null;
  49. return new Func<ApiController, bool>(c => current.Invoke((T)c));
  50. }
  51. static Action<ApiController> ToBaseAction(Action<T> current)
  52. {
  53. if (current == null) return null;
  54. return new Action<ApiController>(c => current.Invoke((T)c));
  55. }
  56. /// <summary>创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。</summary>
  57. /// <param name="initializer">初始化程序。当返回 False 时等同于声明 Independent,将不再匹配 Function 和 Default。</param>
  58. /// <param name="default">在匹配 Function 且失败后执行的方法。</param>
  59. /// <remarks>执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose</remarks>
  60. public ApiController(Func<T, bool> initializer = null, Action<T> @default = null) : base(ToBaseFunc(initializer), ToBaseAction(@default)) { }
  61. /// <summary>创建控制器实例。可通过初始化程序返回布尔值,以执行 Function 解析。</summary>
  62. /// <param name="initializer">初始化程序。</param>
  63. /// <param name="default">在匹配 Function 且失败后执行的方法。</param>
  64. /// <remarks>执行顺序:构造函数 -> Initializer -> Function -> Default -> Dispose</remarks>
  65. public ApiController(Action<T> initializer, Action<T> @default = null) : base(ToBaseAction(initializer), ToBaseAction(@default)) { }
  66. }
  67. }