コード例 #1
0
        public Task Dispatch <TMessage>(TMessage message, IMessageHandlerContext messageHandlerContext) where TMessage : IMessage
        {
            var orchestrator = _serviceFactory.GetRequiredService <ISagaOrchestrator>();

            if (message is IStartSagaMessage startSagaMessage)
            {
                return(orchestrator.Start(startSagaMessage, messageHandlerContext));
            }

            var context         = messageHandlerContext.AsMessageBrokerContext();
            var sagaStepHandler = _serviceFactory.GetService <IMessageHandler <TMessage> >();

            if (message is ICompleteSagaMessage completeSagaMessage)
            {
                if (sagaStepHandler is null)
                {
                    return(orchestrator.Complete <TMessage>(null, completeSagaMessage, context));
                }
                else
                {
                    return(orchestrator.Complete <TMessage>(sagaStepHandler.Handle, completeSagaMessage, context));
                }
            }

            if (!(message is ISagaMessage sagaMessage))
            {
                throw new ArgumentException(nameof(message), $"'{typeof(SagaMessageDispatcher).Name}' requires a {nameof(TMessage)} of type '{typeof(ISagaMessage)}'.");
            }

            return(orchestrator.InvokeStep <TMessage>(sagaStepHandler.Handle, sagaMessage, context));
        }