Akka.Interfaced.FilterHandlerBuilder.Build C# (CSharp) Method

Build() public method

public Build ( MethodInfo method, FilterChainKind kind ) : FilterChain
method System.Reflection.MethodInfo
kind FilterChainKind
return FilterChain
        public FilterChain Build(MethodInfo method, FilterChainKind kind)
        {
            var filterItems = BuildFilterItems(_type, method, kind).OrderBy(f => f.Order).ToList();

            return new FilterChain
            {
                PreFilterAccessors = filterItems.Where(f => f.IsPreFilter).Select(f => f.Accessor).ToArray(),
                PostFilterAccessors = filterItems.Where(f => f.IsPostFilter).Select(f => f.Accessor).Reverse().ToArray(),
                PerInvokeFilterFactories = filterItems.Where(f => f.IsPerInvoke).GroupBy(f => f.PerInvokeIndex)
                                                      .OrderBy(g => g.Key).Select(g => (IFilterPerInvokeFactory)g.Last().Factory).ToArray(),
                Empty = filterItems.Any() == false,
                AsyncFilterExists = filterItems.Any(f => f.IsAsync),
                PerInstanceFilterExists = filterItems.Any(f => f.IsPerInstance),
            };
        }

Usage Example

Beispiel #1
0
        private void BuildAnnotatedMessageHandlers()
        {
            // create a handler for every method which has MessageHandlerAttribute

            var methods = _type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            foreach (var method in methods)
            {
                var attr = method.GetCustomAttribute <MessageHandlerAttribute>();
                if (attr == null)
                {
                    continue;
                }

                var messageType   = attr.Type ?? method.GetParameters()[0].ParameterType;
                var isAsyncMethod = (method.ReturnType.Name.StartsWith("Task"));
                var filterChain   = _filterHandlerBuilder.Build(method, FilterChainKind.Message);
                var isSyncHandler = isAsyncMethod == false && filterChain.AsyncFilterExists == false;
                var isReentrant   = isSyncHandler == false && HandlerBuilderHelpers.IsReentrantMethod(method);

                if (isAsyncMethod == false && method.GetCustomAttribute <AsyncStateMachineAttribute>() != null)
                {
                    throw new InvalidOperationException($"Async void handler is not supported. ({_type.FullName}.{method.Name})");
                }

                AddHandler(method, messageType, filterChain, isSyncHandler, isReentrant);
            }
        }
All Usage Examples Of Akka.Interfaced.FilterHandlerBuilder::Build