Browse Source

AddMiddleware 增加重载,支持匿名方法。

master
王厅 5 days ago
parent
commit
38cae76108
  1. 16
      Apewer/Web/ApiInvoker.cs
  2. 28
      Apewer/Web/ApiMiddleware.cs
  3. 26
      Apewer/Web/ApiProcessor.cs

16
Apewer/Web/ApiInvoker.cs

@ -41,16 +41,24 @@ namespace Apewer.Web
#region 中间件
private List<Type> _middlewares = new List<Type>();
private List<ApiMiddleware> _middlewares = new List<ApiMiddleware>();
/// <summary>中间件。</summary>
public Type[] Middlewares { get => _middlewares.ToArray(); }
internal ApiMiddleware[] Middlewares { get => _middlewares.ToArray(); }
/// <summary>添加中间件。</summary>
public void AddMiddleware<T>() where T : class, IApiMiddleware, new()
{
var type = typeof(T);
_middlewares.Add(type);
var middleware = new ApiMiddleware(typeof(T));
_middlewares.Add(middleware);
}
/// <summary>添加中间件。</summary>
/// <exception cref="ArgumentNullException" />
public void AddMiddleware(Action<ApiContext, Action> callback)
{
if (callback == null) throw new ArgumentNullException(nameof(callback));
_middlewares.Add(new ApiMiddleware(callback));
}
#endregion

28
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<ApiContext, Action> Callback;
public ApiMiddleware(Type type)
{
if (!typeof(IApiMiddleware).IsAssignableFrom(type)) throw new NotImplementedException($"类型【{type.FullName}】未实现【{nameof(IApiMiddleware)}】。");
Type = type;
}
public ApiMiddleware(Action<ApiContext, Action> callback)
{
if (callback == null) throw new ArgumentNullException(nameof(callback));
Callback = callback;
}
}
}

26
Apewer/Web/ApiProcessor.cs

@ -60,7 +60,7 @@ namespace Apewer.Web
if (middlewares.Length > 0)
{
// 设置队列和回调。
_mw_queue = new Queue<Type>(middlewares);
_mw_queue = new Queue<ApiMiddleware>(middlewares);
_context.SetMiddlewareCallback(MiddlewareNext);
// 执行。
@ -263,7 +263,7 @@ namespace Apewer.Web
#region middleware
Queue<Type> _mw_queue = null;
Queue<ApiMiddleware> _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);
}
}
// 执行路由。

Loading…
Cancel
Save