Exemple #1
0
        private IHandleRequestsAsync <TRequest> BuildAsyncPipeline(RequestHandlerAsync <TRequest> implicitHandler, IRequestContext requestContext, bool continueOnCapturedContext)
        {
            if (implicitHandler is null)
            {
                throw new ArgumentNullException(nameof(implicitHandler));
            }

            implicitHandler.Context = requestContext;
            implicitHandler.ContinueOnCapturedContext = continueOnCapturedContext;

            if (!_preAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), out IOrderedEnumerable <RequestHandlerAttribute> preAttributes))
            {
                preAttributes =
                    implicitHandler.FindHandlerMethod()
                    .GetOtherHandlersInPipeline()
                    .Where(attribute => attribute.Timing == HandlerTiming.Before)
                    .OrderByDescending(attribute => attribute.Step);

                AddGlobalInboxAttributesAsync(ref preAttributes, implicitHandler);

                _preAttributesMemento.TryAdd(implicitHandler.Name.ToString(), preAttributes);
            }


            AddGlobalInboxAttributesAsync(ref preAttributes, implicitHandler);

            var firstInPipeline = PushOntoAsyncPipeline(preAttributes, implicitHandler, requestContext, continueOnCapturedContext);

            if (!_postAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), out IOrderedEnumerable <RequestHandlerAttribute> postAttributes))
            {
                postAttributes =
                    implicitHandler.FindHandlerMethod()
                    .GetOtherHandlersInPipeline()
                    .Where(attribute => attribute.Timing == HandlerTiming.After)
                    .OrderByDescending(attribute => attribute.Step);
            }

            AppendToAsyncPipeline(postAttributes, implicitHandler, requestContext);
            s_logger.LogDebug("New async handler pipeline created: {0}", TracePipeline(firstInPipeline));
            return(firstInPipeline);
        }
Exemple #2
0
        private IHandleRequestsAsync <TRequest> BuildAsyncPipeline(RequestHandlerAsync <TRequest> implicitHandler, IRequestContext requestContext, bool continueOnCapturedContext)
        {
            implicitHandler.Context = requestContext;
            implicitHandler.ContinueOnCapturedContext = continueOnCapturedContext;

            var preAttributes =
                implicitHandler.FindHandlerMethod()
                .GetOtherHandlersInPipeline()
                .Where(attribute => attribute.Timing == HandlerTiming.Before)
                .OrderByDescending(attribute => attribute.Step);

            var firstInPipeline = PushOntoAsyncPipeline(preAttributes, implicitHandler, requestContext, continueOnCapturedContext);

            var postAttributes =
                implicitHandler.FindHandlerMethod()
                .GetOtherHandlersInPipeline()
                .Where(attribute => attribute.Timing == HandlerTiming.After)
                .OrderByDescending(attribute => attribute.Step);

            AppendToAsyncPipeline(postAttributes, implicitHandler, requestContext);
            _logger.Value.DebugFormat("New async handler pipeline created: {0}", TracePipeline(firstInPipeline));
            return(firstInPipeline);
        }
Exemple #3
0
        private void AddGlobalInboxAttributesAsync(ref IOrderedEnumerable <RequestHandlerAttribute> preAttributes, RequestHandlerAsync <TRequest> implicitHandler)
        {
            if (_inboxConfiguration == null ||
                implicitHandler.FindHandlerMethod().HasNoInboxAttributesInPipeline() ||
                implicitHandler.FindHandlerMethod().HasExistingUseInboxAttributesInPipeline()

                )
            {
                return;
            }

            var useInboxAttribute = new UseInboxAsyncAttribute(
                step: 0,
                contextKey: _inboxConfiguration.Context(implicitHandler.GetType()),
                onceOnly: _inboxConfiguration.OnceOnly,
                timing: HandlerTiming.Before,
                onceOnlyAction: _inboxConfiguration.ActionOnExists);

            PushOntoAttributeList(ref preAttributes, useInboxAttribute);
        }