@@ -11,20 +11,59 @@ namespace DotNetCoreRpc.Core
1111 public static class RpcFilterUtils
1212 {
1313 private static readonly ConcurrentDictionary < string , IEnumerable < PropertyInfo > > _filterFromServices = new ConcurrentDictionary < string , IEnumerable < PropertyInfo > > ( ) ;
14- public static RpcFilterAttribute GetInstance ( IServiceProvider serviceProvider , Type filterType )
14+ private static readonly ConcurrentDictionary < string , List < RpcFilterAttribute > > _methodFilters = new ConcurrentDictionary < string , List < RpcFilterAttribute > > ( ) ;
15+
16+ /// <summary>
17+ /// 获取方法filters
18+ /// </summary>
19+ /// <returns></returns>
20+ public static List < RpcFilterAttribute > GetFilterAttributes ( RpcContext aspectContext , IEnumerable < Type > filterTypes )
1521 {
16- return ActivatorUtilities . CreateInstance ( serviceProvider , filterType ) as RpcFilterAttribute ;
22+ var methondInfo = aspectContext . Method ;
23+
24+ var methondInterceptorAttributes = _methodFilters . GetOrAdd ( $ "{ methondInfo . DeclaringType . FullName } #{ methondInfo . Name } ",
25+ key => {
26+ var methondAttributes = methondInfo . GetCustomAttributes ( true )
27+ . Where ( i => typeof ( RpcFilterAttribute ) . IsAssignableFrom ( i . GetType ( ) ) )
28+ . Cast < RpcFilterAttribute > ( ) . ToList ( ) ;
29+ var classAttributes = methondInfo . DeclaringType . GetCustomAttributes ( true )
30+ . Where ( i => typeof ( RpcFilterAttribute ) . IsAssignableFrom ( i . GetType ( ) ) )
31+ . Cast < RpcFilterAttribute > ( ) ;
32+ //获取方法filter
33+ methondAttributes . AddRange ( classAttributes ) ;
34+ //获取全局filter
35+ var glableInterceptorAttribute = GetInstances ( aspectContext . HttpContext . RequestServices , filterTypes ) ;
36+ methondAttributes . AddRange ( glableInterceptorAttribute ) ;
37+ return methondAttributes ;
38+ } ) ;
39+
40+ //filter属性注入
41+ PropertiesInject ( aspectContext . HttpContext . RequestServices , methondInterceptorAttributes ) ;
42+ return methondInterceptorAttributes ;
1743 }
1844
19- public static IEnumerable < RpcFilterAttribute > GetInstances ( IServiceProvider serviceProvider , IEnumerable < Type > filterTypes )
45+ private static IEnumerable < RpcFilterAttribute > GetInstances ( IServiceProvider serviceProvider , IEnumerable < Type > filterTypes )
2046 {
2147 foreach ( var filterType in filterTypes )
2248 {
2349 yield return GetInstance ( serviceProvider , filterType ) ;
2450 }
2551 }
2652
27- public static void PropertieInject ( IServiceProvider serviceProvider , RpcFilterAttribute rpcFilterAttribute )
53+ private static RpcFilterAttribute GetInstance ( IServiceProvider serviceProvider , Type filterType )
54+ {
55+ return ActivatorUtilities . CreateInstance ( serviceProvider , filterType ) as RpcFilterAttribute ;
56+ }
57+
58+ private static void PropertiesInject ( IServiceProvider serviceProvider , IEnumerable < RpcFilterAttribute > rpcFilterAttributes )
59+ {
60+ foreach ( var fitler in rpcFilterAttributes )
61+ {
62+ PropertieInject ( serviceProvider , fitler ) ;
63+ }
64+ }
65+
66+ private static void PropertieInject ( IServiceProvider serviceProvider , RpcFilterAttribute rpcFilterAttribute )
2867 {
2968 var properties = _filterFromServices . GetOrAdd ( $ "{ rpcFilterAttribute . GetType ( ) . FullName } ", key => rpcFilterAttribute . GetType ( ) . GetProperties ( BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic ) . Where ( i => i . GetCustomAttribute < FromServicesAttribute > ( ) != null ) ) ;
3069 if ( properties . Any ( ) )
@@ -35,13 +74,5 @@ public static void PropertieInject(IServiceProvider serviceProvider, RpcFilterAt
3574 }
3675 }
3776 }
38-
39- public static void PropertiesInject ( IServiceProvider serviceProvider , IEnumerable < RpcFilterAttribute > rpcFilterAttributes )
40- {
41- foreach ( var fitler in rpcFilterAttributes )
42- {
43- PropertieInject ( serviceProvider , fitler ) ;
44- }
45- }
4677 }
4778}
0 commit comments