/// <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)); }
/// <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)); }
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); }
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; }