Exemple #1
0
        public SagaEventConnectorFactory(ISagaRepository <TSaga> sagaRepository, ISagaPolicyFactory policyFactory,
                                         DataEvent <TSaga, TMessage> dataEvent, IEnumerable <State> states)
        {
            _sagaRepository = sagaRepository;
            _policyFactory  = policyFactory;
            _dataEvent      = dataEvent;
            _states         = states;

            _removeExpression = SagaStateMachine <TSaga> .GetCompletedExpression();
        }
        public IPipelineSink <TMessage> Create(DataEvent <TSaga, TMessage> eevent, IEnumerable <State> states)
        {
            Type messageType = typeof(TMessage);

            Expression <Func <TSaga, bool> > removeExpression = SagaStateMachine <TSaga> .GetCompletedExpression();

            ISagaPolicy <TSaga, TMessage> policy = _policyFactory.GetPolicy <TSaga, TMessage>(states, removeExpression);

            Expression <Func <TSaga, TMessage, bool> > expression;

            if (SagaStateMachine <TSaga> .TryGetCorrelationExpressionForEvent(eevent, out expression))
            {
                return(this.FastInvoke <SagaStateMachineMessageSinkFactory <TSaga, TMessage>, IPipelineSink <TMessage> >("CreateSink", eevent, policy, expression));
            }

            // we check for a standard correlation interface second
            if (messageType.GetInterfaces().Where(x => x == typeof(CorrelatedBy <Guid>)).Count() > 0)
            {
                return(this.FastInvoke <SagaStateMachineMessageSinkFactory <TSaga, TMessage>, IPipelineSink <TMessage> >("CreateCorrelatedSink", eevent, policy));
            }

            throw new NotSupportedException("No method to connect to event was found for " + typeof(TMessage).FullName);
        }