From 38cae761080d19f5ec4bf44576e7aa47a94f5eef Mon Sep 17 00:00:00 2001 From: Elivo Date: Thu, 30 Oct 2025 12:58:04 +0800 Subject: [PATCH] =?UTF-8?q?AddMiddleware=20=E5=A2=9E=E5=8A=A0=E9=87=8D?= =?UTF-8?q?=E8=BD=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E5=8C=BF=E5=90=8D=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apewer/Web/ApiInvoker.cs | 16 ++++++++++++---- Apewer/Web/ApiMiddleware.cs | 28 ++++++++++++++++++++++++++++ Apewer/Web/ApiProcessor.cs | 26 ++++++++++++++++++-------- 3 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 Apewer/Web/ApiMiddleware.cs diff --git a/Apewer/Web/ApiInvoker.cs b/Apewer/Web/ApiInvoker.cs index 104a214..0522861 100644 --- a/Apewer/Web/ApiInvoker.cs +++ b/Apewer/Web/ApiInvoker.cs @@ -41,16 +41,24 @@ namespace Apewer.Web #region 中间件 - private List _middlewares = new List(); + private List _middlewares = new List(); /// 中间件。 - public Type[] Middlewares { get => _middlewares.ToArray(); } + internal ApiMiddleware[] Middlewares { get => _middlewares.ToArray(); } /// 添加中间件。 public void AddMiddleware() where T : class, IApiMiddleware, new() { - var type = typeof(T); - _middlewares.Add(type); + var middleware = new ApiMiddleware(typeof(T)); + _middlewares.Add(middleware); + } + + /// 添加中间件。 + /// + public void AddMiddleware(Action callback) + { + if (callback == null) throw new ArgumentNullException(nameof(callback)); + _middlewares.Add(new ApiMiddleware(callback)); } #endregion diff --git a/Apewer/Web/ApiMiddleware.cs b/Apewer/Web/ApiMiddleware.cs new file mode 100644 index 0000000..20457cb --- /dev/null +++ b/Apewer/Web/ApiMiddleware.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Apewer.Web +{ + + internal class ApiMiddleware + { + + internal Type Type; + internal Action Callback; + + public ApiMiddleware(Type type) + { + if (!typeof(IApiMiddleware).IsAssignableFrom(type)) throw new NotImplementedException($"类型【{type.FullName}】未实现【{nameof(IApiMiddleware)}】。"); + Type = type; + } + + public ApiMiddleware(Action callback) + { + if (callback == null) throw new ArgumentNullException(nameof(callback)); + Callback = callback; + } + + } + +} diff --git a/Apewer/Web/ApiProcessor.cs b/Apewer/Web/ApiProcessor.cs index 674ffc7..8a70f0a 100644 --- a/Apewer/Web/ApiProcessor.cs +++ b/Apewer/Web/ApiProcessor.cs @@ -60,7 +60,7 @@ namespace Apewer.Web if (middlewares.Length > 0) { // 设置队列和回调。 - _mw_queue = new Queue(middlewares); + _mw_queue = new Queue(middlewares); _context.SetMiddlewareCallback(MiddlewareNext); // 执行。 @@ -263,7 +263,7 @@ namespace Apewer.Web #region middleware - Queue _mw_queue = null; + Queue _mw_queue = null; void MiddlewareNext(ApiContext context) { @@ -274,13 +274,23 @@ namespace Apewer.Web } // 创建下一个中间件的实例 - var type = _mw_queue.Dequeue(); - var instance = Activator.CreateInstance(type); - var middleware = instance as IApiMiddleware; - if (middleware == null) throw new Exception($"类型【{type.FullName}】不是有效的中间件。"); + var middleware = _mw_queue.Dequeue(); + if (middleware.Type != null) + { + var instance = Activator.CreateInstance(middleware.Type) as IApiMiddleware; + if (instance == null) throw new Exception($"类型【{middleware.Type.FullName}】不是有效的中间件。"); - // 调用 - middleware.Invoke(context); + // 调用 + instance.Invoke(context); + } + else if (middleware.Callback != null) + { + middleware.Callback.Invoke(context, () => MiddlewareNext(context)); + } + else + { + MiddlewareNext(context); + } } // 执行路由。