mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-18 01:16:44 +08:00
全局注册IRpcActionFilter (#83)
This commit is contained in:
@@ -246,9 +246,11 @@ public sealed class RpcMethod : Method
|
||||
/// <summary>
|
||||
/// 筛选器
|
||||
/// </summary>
|
||||
public IReadOnlyList<IRpcActionFilter> GetFilters()
|
||||
/// <param name="g_actionFilters">全局筛选器</param>
|
||||
/// <returns></returns>
|
||||
public IReadOnlyList<IRpcActionFilter> GetFilters(IReadOnlyList<IRpcActionFilter> g_actionFilters)
|
||||
{
|
||||
if (this.m_hasFilters[0] || this.m_hasFilters[1] || this.m_hasFilters[2] || this.m_hasFilters[3])
|
||||
if (this.m_hasFilters[0] || this.m_hasFilters[1] || this.m_hasFilters[2] || this.m_hasFilters[3] || (g_actionFilters?.Any()) == true)
|
||||
{
|
||||
var actionFilters = new List<IRpcActionFilter>();
|
||||
//注册方法
|
||||
@@ -297,6 +299,14 @@ public sealed class RpcMethod : Method
|
||||
}
|
||||
}
|
||||
|
||||
if (g_actionFilters?.Any() == true)
|
||||
{
|
||||
//全局筛选器
|
||||
foreach (var filter in g_actionFilters)
|
||||
{
|
||||
this.AddActionFilter(filter, ref actionFilters);
|
||||
}
|
||||
}
|
||||
return actionFilters;
|
||||
}
|
||||
return new IRpcActionFilter[0];
|
||||
|
||||
@@ -108,8 +108,54 @@ public sealed class RpcStore
|
||||
return this.m_serverTypes[serverType].ToArray();
|
||||
}
|
||||
|
||||
#region 全局筛选器
|
||||
|
||||
private readonly ConcurrentList<Type> m_filters = new ConcurrentList<Type>();
|
||||
|
||||
/// <summary>
|
||||
/// 获取全局筛选器对象
|
||||
/// </summary>
|
||||
/// <param name="callContext"></param>
|
||||
/// <returns></returns>
|
||||
public IReadOnlyList<IRpcActionFilter> GetFilters(ICallContext callContext)
|
||||
{
|
||||
return m_filters.Select(s=>(IRpcActionFilter) callContext.Resolver.Resolve(s)).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加全局筛选器
|
||||
/// </summary>
|
||||
/// <typeparam name="TFilter"></typeparam>
|
||||
public void Filter<TFilter>() where TFilter : class, IRpcActionFilter
|
||||
{
|
||||
var filterType = typeof(TFilter);
|
||||
this.Filter(filterType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加全局过滤器
|
||||
/// </summary>
|
||||
public void Filter(Type filterType)
|
||||
{
|
||||
if (!typeof(IRpcActionFilter).IsAssignableFrom(filterType))
|
||||
{
|
||||
throw new RpcException($"注册类型必须与{nameof(IRpcActionFilter)}有继承关系");
|
||||
}
|
||||
|
||||
if (!m_filters.Any(s => s.FullName == filterType.FullName))
|
||||
{
|
||||
m_filters.Add(filterType);
|
||||
this.m_registrator.RegisterTransient(filterType);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 注册
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 注册为单例服务
|
||||
/// </summary>
|
||||
|
||||
@@ -42,7 +42,7 @@ internal sealed class InternalRpcServerProvider : IRpcServerProvider
|
||||
return new InvokeResult(InvokeStatus.UnFound);
|
||||
}
|
||||
|
||||
var filters = method.GetFilters();
|
||||
var filters = method.GetFilters(m_rpcStore.GetFilters(callContext));
|
||||
try
|
||||
{
|
||||
for (var i = 0; i < filters.Count; i++)
|
||||
|
||||
Reference in New Issue
Block a user