/// <summary>
 /// Adds a synchronous delegate activity to the event's behavior
 /// </summary>
 /// <typeparam name="TInstance">The state machine instance type</typeparam>
 /// <typeparam name="TException">The exception type</typeparam>
 /// <param name="binder">The event binder</param>
 /// <param name="action">The synchronous delegate</param>
 public static ExceptionActivityBinder <TInstance, TException> Then <TInstance, TException>(
     this ExceptionActivityBinder <TInstance, TException> binder, Action <BehaviorExceptionContext <TInstance, TException> > action)
     where TInstance : class
     where TException : Exception
 {
     return(binder.Add(new FaultedActionActivity <TInstance, TException>(action)));
 }
Beispiel #2
0
 /// <summary>
 /// Adds a asynchronous delegate activity to the event's behavior
 /// </summary>
 /// <typeparam name="TInstance">The state machine instance type</typeparam>
 /// <typeparam name="TException">The exception type</typeparam>
 /// <param name="binder">The event binder</param>
 /// <param name="asyncAction">The asynchronous delegate</param>
 public static ExceptionActivityBinder <TInstance, TException> ThenAsync <TInstance, TException>(
     this ExceptionActivityBinder <TInstance, TException> binder, Func <BehaviorExceptionContext <TInstance, TException>, Task> asyncAction)
     where TInstance : class
     where TException : Exception
 {
     return(binder.Add(new AsyncFaultedActionActivity <TInstance, TException>(asyncAction)));
 }
 /// <summary>
 /// Unschedule a message, if the message was scheduled.
 /// </summary>
 /// <param name="source"></param>
 /// <param name="schedule"></param>
 /// <returns></returns>
 public static ExceptionActivityBinder <TInstance, TException> Unschedule <TInstance, TException>(
     this ExceptionActivityBinder <TInstance, TException> source, Schedule <TInstance> schedule)
     where TInstance : class, SagaStateMachineInstance
     where TException : Exception
 {
     return(source.Add(new FaultedUnscheduleActivity <TInstance>(schedule)));
 }
Beispiel #4
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Publish <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, EventExceptionMessageFactory <TInstance, TData, TException, TMessage> messageFactory)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedPublishActivity <TInstance, TData, TException, TMessage>(messageFactory)));
 }
Beispiel #5
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Schedule <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, Schedule <TInstance, TMessage> schedule, TMessage message)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TException : Exception
     where TMessage : class
 {
     return(source.Add(new FaultedScheduleActivity <TInstance, TData, TException, TMessage>(x => message, schedule)));
 }
Beispiel #6
0
 public static ExceptionActivityBinder <TInstance, TException> SendAsync <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, DestinationAddressProvider <TInstance> destinationAddressProvider,
     Task <TMessage> message, Action <SendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new SendActivity <TInstance, TMessage>(destinationAddressProvider, x => message, contextCallback)));
 }
Beispiel #7
0
 public static ExceptionActivityBinder <TInstance, TException> PublishAsync <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, Task <TMessage> message,
     Action <PublishContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedPublishActivity <TInstance, TException, TMessage>(x => message, contextCallback)));
 }
 public static ExceptionActivityBinder <TInstance, TException> Produce <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, ExceptionEventHubNameProvider <TInstance, TException> nameProvider,
     Task <TMessage> message, Action <EventHubSendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedProduceActivity <TInstance, TException, TMessage>(nameProvider, x => message, contextCallback)));
 }
Beispiel #9
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Send <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, Uri destinationAddress, TMessage message)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new SendActivity <TInstance, TData, TMessage>(destinationAddress, x => message)));
 }
Beispiel #10
0
 public static ExceptionActivityBinder <TInstance, TException> Schedule <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, Schedule <TInstance, TMessage> schedule, Task <TMessage> message,
     ScheduleTimeExceptionProvider <TInstance, TException> timeProvider, Action <SendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TException : Exception
     where TMessage : class
 {
     return(source.Add(new FaultedScheduleActivity <TInstance, TException, TMessage>(x => message, schedule, timeProvider, contextCallback)));
 }
Beispiel #11
0
 public static ExceptionActivityBinder <TInstance, TException> Respond <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, TMessage message,
     Action <SendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedRespondActivity <TInstance, TException, TMessage>(x => message, contextCallback)));
 }
 public static ExceptionActivityBinder <TInstance, TException> SendAsync <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source,
     AsyncEventExceptionMessageFactory <TInstance, TException, TMessage> messageFactory, Action <SendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedSendActivity <TInstance, TException, TMessage>(messageFactory, contextCallback)));
 }
Beispiel #13
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Respond <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, TMessage message)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedRespondActivity <TInstance, TData, TException, TMessage>(x => message)));
 }
Beispiel #14
0
 public static ExceptionActivityBinder <TInstance, TException> SendAsync <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, Task <TMessage> message,
     SendContextCallback <TInstance, TMessage> contextCallback)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new SendActivity <TInstance, TMessage>(x => message, contextCallback)));
 }
 public static ExceptionActivityBinder <TInstance, TException> Produce <TInstance, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TException> source, TMessage message,
     Action <KafkaSendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedProduceActivity <TInstance, TException, TMessage>(x => Task.FromResult(message), contextCallback)));
 }
Beispiel #16
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Schedule <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, Schedule <TInstance, TMessage> schedule,
     EventExceptionMessageFactory <TInstance, TData, TException, TMessage> messageFactory)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TException : Exception
     where TMessage : class
 {
     return(source.Add(new FaultedScheduleActivity <TInstance, TData, TException, TMessage>(messageFactory, schedule, x => schedule.Delay)));
 }
Beispiel #17
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Schedule <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, Schedule <TInstance, TMessage> schedule, TMessage message,
     Action <SendContext> contextCallback, ScheduleDelayProvider <TInstance, TData, TException> delayProvider)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TException : Exception
     where TMessage : class
 {
     return(source.Add(new FaultedScheduleActivity <TInstance, TData, TException, TMessage>(x => message, schedule, contextCallback, delayProvider)));
 }
Beispiel #18
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Send <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, ObsoleteDestinationAddressProvider <TInstance, TData> destinationAddressProvider,
     TMessage message, Action <SendContext <TMessage> > contextCallback = null)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new SendActivity <TInstance, TData, TMessage>(x => destinationAddressProvider(x.Instance, x.Data), x => message, contextCallback)));
 }
Beispiel #19
0
 public static ExceptionActivityBinder <TInstance, TData, TException> Send <TInstance, TData, TException, TMessage>(
     this ExceptionActivityBinder <TInstance, TData, TException> source, Uri destinationAddress,
     EventExceptionMessageFactory <TInstance, TData, TException, TMessage> messageFactory, Action <SendContext <TMessage> > contextCallback)
     where TInstance : class, SagaStateMachineInstance
     where TData : class
     where TMessage : class
     where TException : Exception
 {
     return(source.Add(new FaultedSendActivity <TInstance, TData, TException, TMessage>(destinationAddress, messageFactory, contextCallback)));
 }
        /// <summary>
        /// Transition the state machine to the Final state
        /// </summary>
        public static ExceptionActivityBinder <TInstance, TException> Finalize <TInstance, TException>(
            this ExceptionActivityBinder <TInstance, TException> source)
            where TInstance : class
            where TException : Exception
        {
            State <TInstance> state = source.StateMachine.GetState(source.StateMachine.Final.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            return(source.Add(activity));
        }
        /// <summary>
        /// Transition the state machine to the specified state in response to an exception
        /// </summary>
        /// <typeparam name="TInstance"></typeparam>
        /// <typeparam name="TException"></typeparam>
        /// <param name="source"></param>
        /// <param name="toState"></param>
        /// <returns></returns>
        public static ExceptionActivityBinder <TInstance, TException> TransitionTo <TInstance, TException>(
            this ExceptionActivityBinder <TInstance, TException> source, State toState)
            where TInstance : class where TException : Exception
        {
            State <TInstance> state = source.StateMachine.GetState(toState.Name);

            var activity = new TransitionActivity <TInstance>(state, source.StateMachine.Accessor);

            var compensateActivity = new ExecuteOnFaultedActivity <TInstance>(activity);

            return(source.Add(compensateActivity));
        }
Beispiel #22
0
        /// <summary>
        /// Send a request to the configured service endpoint, and setup the state machine to accept the response.
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <typeparam name="TRequest">The request message type</typeparam>
        /// <typeparam name="TResponse">The response message type</typeparam>
        /// <typeparam name="TException"></typeparam>
        /// <param name="binder">The event binder</param>
        /// <param name="request">The configured request to use</param>
        /// <param name="messageFactory">The request message factory</param>
        /// <returns></returns>
        public static ExceptionActivityBinder <TInstance, TException> Request <TInstance, TException, TRequest, TResponse>(
            this ExceptionActivityBinder <TInstance, TException> binder, Request <TInstance, TRequest, TResponse> request,
            AsyncEventExceptionMessageFactory <TInstance, TException, TRequest> messageFactory)
            where TInstance : class, SagaStateMachineInstance
            where TRequest : class
            where TResponse : class
            where TException : Exception
        {
            ScheduleTokenId.UseTokenId <RequestTimeoutExpired <TRequest> >(x => x.RequestId);
            var activity = new FaultedRequestActivity <TInstance, TException, TRequest, TResponse>(request, messageFactory);

            return(binder.Add(activity));
        }
Beispiel #23
0
        /// <summary>
        /// Send a request to the configured service endpoint, and setup the state machine to accept the response.
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <typeparam name="TData">The event data type</typeparam>
        /// <typeparam name="TRequest">The request message type</typeparam>
        /// <typeparam name="TResponse">The response message type</typeparam>
        /// <typeparam name="TException"></typeparam>
        /// <param name="binder">The event binder</param>
        /// <param name="request">The configured request to use</param>
        /// <param name="messageFactory">The request message factory</param>
        /// <returns></returns>
        public static ExceptionActivityBinder <TInstance, TData, TException> Request <TInstance, TData, TException, TRequest, TResponse>(
            this ExceptionActivityBinder <TInstance, TData, TException> binder, Request <TInstance, TRequest, TResponse> request,
            EventExceptionMessageFactory <TInstance, TData, TException, TRequest> messageFactory)
            where TInstance : class, SagaStateMachineInstance
            where TData : class
            where TRequest : class
            where TResponse : class
            where TException : Exception
        {
            var activity = new FaultedRequestActivity <TInstance, TData, TException, TRequest, TResponse>(request, messageFactory);

            return(binder.Add(activity));
        }
        public static ExceptionActivityBinder <TInstance, TException> Schedule <TInstance, TException, TMessage>(
            this ExceptionActivityBinder <TInstance, TException> source, Schedule <TInstance, TMessage> schedule,
            AsyncEventExceptionMessageFactory <TInstance, TException, TMessage> messageFactory, Action <SendContext <TMessage> > contextCallback = null)
            where TInstance : class, SagaStateMachineInstance
            where TException : Exception
            where TMessage : class
        {
            DateTime TimeProvider(ConsumeExceptionEventContext <TInstance, TException> context)
            {
                return(DateTime.UtcNow + schedule.Delay);
            }

            return(source.Add(new FaultedScheduleActivity <TInstance, TException, TMessage>(messageFactory, schedule, TimeProvider, contextCallback)));
        }
        public static ExceptionActivityBinder <TInstance, TData, TException> Schedule <TInstance, TData, TException, TMessage>(
            this ExceptionActivityBinder <TInstance, TData, TException> source, Schedule <TInstance, TMessage> schedule, Task <TMessage> message,
            ScheduleDelayExceptionProvider <TInstance, TData, TException> delayProvider, Action <SendContext <TMessage> > contextCallback = null)
            where TInstance : class, SagaStateMachineInstance
            where TData : class
            where TException : Exception
            where TMessage : class
        {
            DateTime TimeProvider(ConsumeExceptionEventContext <TInstance, TData, TException> context)
            {
                return(DateTime.UtcNow + delayProvider(context));
            }

            return(source.Add(new FaultedScheduleActivity <TInstance, TData, TException, TMessage>(x => message, schedule, TimeProvider, contextCallback)));
        }
 private ExceptionActivityBinder <SaleBetSaga, Exception> DefaultExceptionHandler(ExceptionActivityBinder <SaleBetSaga, Exception> ex, State state)
 {
     return(ex
            .Then(WriteException)
            .TransitionTo(state)
            .Then(async context => await WriteState(context)));
 }
        private ExceptionActivityBinder <SaleBetSaga, BetException> BetExceptionHandler(ExceptionActivityBinder <SaleBetSaga, BetException> ex)
        {
            var value = ex.Then(WriteException)
                        .TransitionTo(FailureBet)
                        .Then(async context => await WriteState(context));

            return(value);
        }