예제 #1
0
        public Task RunAsync <TM>(IMessageContext <TM> messageContext, CancellationToken cancellationToken = default)
            where TM : IMessage
        {
            if (messageContext == null)
            {
                throw new ArgumentNullException(nameof(messageContext));
            }

            //TODO: an event can be handled by multiple sagas
            var types = _stateTypeResolver.Resolve <TM>();

            if (default == types)
            {
                throw new SagaNotFoundException($"no saga registered for message of type '{typeof(TM).FullName}'");
            }

            var runnerType = _typesCache.GetGeneric(typeof(ISagaRunner <,>), types.sagaType, types.sagaStateType);
            var runner     = _serviceProvider.GetService(runnerType);

            if (null == runner)
            {
                throw new SagaNotFoundException($"no saga registered on DI for message of type '{typeof(TM).FullName}'");
            }

            return(RunAsyncCore(messageContext, runner, cancellationToken));
        }
예제 #2
0
        public Task RunAsync <TM>(IMessageContext <TM> messageContext, CancellationToken cancellationToken = default)
            where TM : IMessage
        {
            if (messageContext == null)
            {
                throw new ArgumentNullException(nameof(messageContext));
            }

            var sagaTypes = _stateTypeResolver.Resolve <TM>();

            if (null == sagaTypes || !sagaTypes.Any())
            {
                throw new SagaException($"no Saga registered for message of type '{typeof(TM).FullName}'");
            }

            return(RunAsyncCore(messageContext, sagaTypes, cancellationToken));
        }
예제 #3
0
        public Task RunAsync <TM>(IMessageContext <TM> messageContext, CancellationToken cancellationToken = default)
            where TM : IMessage
        {
            if (messageContext == null)
            {
                throw new ArgumentNullException(nameof(messageContext));
            }

            var sagaTypes = _stateTypeResolver.Resolve <TM>();

            if (null == sagaTypes)
            {
                return(Task.CompletedTask);
            }

            return(RunAsyncCore(messageContext, sagaTypes, cancellationToken));
        }