全局注册IRpcActionFilter (#83)

This commit is contained in:
张志炜
2025-09-17 21:50:27 +08:00
committed by GitHub
parent 3f453d6ef2
commit 783410c339
3 changed files with 59 additions and 3 deletions

View File

@@ -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];

View File

@@ -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>

View File

@@ -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++)