/// <summary>
        /// Declares a request that is sent by the state machine to a service, and the associated response, fault, and
        /// timeout handling. The property is initialized with the fully built Request. The request must be declared before
        /// it is used in the state/event declaration statements.
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="propertyExpression">The request property on the state machine</param>
        /// <param name="requestIdExpression">The property where the requestId is stored</param>
        /// <param name="settings">The request settings (which can be read from configuration, etc.)</param>
        protected void Request <TRequest, TResponse>(Expression <Func <Request <TInstance, TRequest, TResponse> > > propertyExpression,
                                                     Expression <Func <TInstance, Guid?> > requestIdExpression,
                                                     RequestSettings settings)
            where TRequest : class
            where TResponse : class
        {
            var property = propertyExpression.GetPropertyInfo();

            var requestName = property.Name;

            var request = new StateMachineRequest <TInstance, TRequest, TResponse>(requestName, requestIdExpression, settings);

            property.SetValue(this, request);

            Event(propertyExpression, x => x.Completed, x => x.CorrelateBy(requestIdExpression, context => context.RequestId));
            Event(propertyExpression, x => x.Faulted, x => x.CorrelateBy(requestIdExpression, context => context.RequestId));
            Event(propertyExpression, x => x.TimeoutExpired, x => x.CorrelateBy <Guid>(requestIdExpression, context => context.Message.RequestId));

            State(propertyExpression, x => x.Pending);

            DuringAny(
                When(request.Completed)
                .CancelRequestTimeout(request)
                .ClearRequest(request),
                When(request.Faulted)
                .CancelRequestTimeout(request)
                .ClearRequest(request),
                When(request.TimeoutExpired)
                .ClearRequest(request));
        }
Example #2
0
        /// <summary>
        /// Declares a request that is sent by the state machine to a service, and the associated response, fault, and
        /// timeout handling. The property is initialized with the fully built Request. The request must be declared before
        /// it is used in the state/event declaration statements.
        /// Uses the Saga CorrelationId as the RequestId
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <typeparam name="TResponse2">The alternate response type</typeparam>
        /// <typeparam name="TResponse3"></typeparam>
        /// <param name="propertyExpression">The request property on the state machine</param>
        /// <param name="settings">The request settings (which can be read from configuration, etc.)</param>
        protected void Request <TRequest, TResponse, TResponse2, TResponse3>(Expression <Func <Request <TInstance, TRequest, TResponse, TResponse2, TResponse3> > > propertyExpression,
                                                                             RequestSettings settings)
            where TRequest : class
            where TResponse : class
            where TResponse2 : class
            where TResponse3 : class
        {
            var property = propertyExpression.GetPropertyInfo();

            var request = new StateMachineRequest <TInstance, TRequest, TResponse, TResponse2, TResponse3>(property.Name, settings);

            InitializeRequest(this, property, request);

            Event(propertyExpression, x => x.Completed, x => x.CorrelateById(context => context.RequestId ?? throw new RequestException("Missing RequestId")));
            Event(propertyExpression, x => x.Completed2, x => x.CorrelateById(context => context.RequestId ?? throw new RequestException("Missing RequestId")));
            Event(propertyExpression, x => x.Completed3, x => x.CorrelateById(context => context.RequestId ?? throw new RequestException("Missing RequestId")));
            Event(propertyExpression, x => x.Faulted, x => x.CorrelateById(context => context.RequestId ?? throw new RequestException("Missing RequestId")));
            Event(propertyExpression, x => x.TimeoutExpired, x => x.CorrelateById(context => context.Message.RequestId));

            State(propertyExpression, x => x.Pending);

            DuringAny(
                When(request.Completed)
                .CancelRequestTimeout(request),
                When(request.Completed2)
                .CancelRequestTimeout(request),
                When(request.Completed3)
                .CancelRequestTimeout(request),
                When(request.Faulted)
                .CancelRequestTimeout(request));
        }
Example #3
0
            protected void Request <TRequest, TResponse>(Expression <Func <Request <TRequest, TResponse> > > propertyExpression,
                                                         RequestSettings settings)
                where TRequest : class
                where TResponse : class
            {
                PropertyInfo property = propertyExpression.GetPropertyInfo();

                string requestName = property.Name;

                var request = new StateMachineRequest <TRequest, TResponse>(requestName, settings);

                property.SetValue(this, request);

                Event(propertyExpression, x => x.Completed);
                Event(propertyExpression, x => x.Faulted);
                Event(propertyExpression, x => x.TimeoutExpired);

                State(propertyExpression, x => x.Pending);
            }
Example #4
0
            private static void Request <TInstance, TRequest, TResponse>(
                this StateMachineModifier <TInstance> modifier, string requestName,
                RequestSettings settings, out Request <TRequest, TResponse> request)
                where TInstance : class
                where TRequest : class
                where TResponse : class
            {
                var smRequest = new StateMachineRequest <TRequest, TResponse>(requestName, settings);

                modifier.Event("Completed", out Event <TResponse> Completed);
                smRequest.Completed = Completed;

                modifier.Event("Faulted", out Event <Fault <TRequest> > Faulted);
                smRequest.Faulted = Faulted;

                modifier.Event("TimeoutExpired", out Event <TRequest> TimeoutExpired);
                smRequest.TimeoutExpired = TimeoutExpired;

                modifier.State("Pending", out State Pending);
                smRequest.Pending = Pending;

                request = smRequest;
            }