Esempio n. 1
0
 public void PersistSagasWith(ISagaPersistence sagaPersistence)
 {
     _graph.SagaPersistence = sagaPersistence;
 }
Esempio n. 2
0
        public void Apply(HandlerChain chain, ISagaPersistence persistence)
        {
            if (persistence == null)
            {
                throw new InvalidOperationException("No saga persistence strategy is registered.");
            }

            var sagaStateType = DetermineSagaStateType(chain);
            var sagaIdType    = persistence.DetermineSagaIdType(sagaStateType);

            var sagaHandler = chain.Handlers.FirstOrDefault(x => x.HandlerType.Closes(typeof(StatefulSagaOf <>)));

            var existence = DetermineExistence(sagaHandler.As <HandlerCall>());


            Variable sagaIdVariable = null;

            if (existence == SagaStateExistence.Existing)
            {
                var identityMethod = sagaHandler
                                     .HandlerType
                                     .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
                                     .Where(x => x.Name == IdentityMethodName && x.ReturnType == sagaIdType)
                                     .FirstOrDefault(x => x.GetParameters().Any(p => p.ParameterType == chain.MessageType));

                var sagaId = ChooseSagaIdProperty(chain.MessageType);

                sagaIdVariable = createSagaIdVariable(sagaHandler.HandlerType, chain.MessageType, sagaId, identityMethod, sagaIdType);



                chain.Middleware.Add(sagaIdVariable.Creator);
            }



            var existingState = sagaHandler.Creates.FirstOrDefault(x => x.VariableType == sagaStateType);

            // Tells the handler chain codegen to not use this as a cascading message
            existingState?.Properties.Add(HandlerChain.NotCascading, true);

            var persistenceFrame = persistence.DeterminePersistenceFrame(existence, ref sagaIdVariable, sagaStateType, existingState, out existingState);

            if (persistenceFrame != null)
            {
                chain.Middleware.Add(persistenceFrame);
            }

            if (existence == SagaStateExistence.Existing)
            {
                chain.Middleware.Add(new AssertSagaStateExistsFrame(existingState, sagaIdVariable));
            }

            var enlistInSagaId = MethodCall.For <IMessageContext>(x => x.EnlistInSaga(null));

            enlistInSagaId.Arguments[0] = sagaIdVariable;
            chain.Postprocessors.Add(enlistInSagaId);


            var storeOrDeleteFrame = persistence.DetermineStoreOrDeleteFrame(existingState, sagaHandler.HandlerType);

            chain.Postprocessors.Add(storeOrDeleteFrame);
        }
Esempio n. 3
0
 public SagaManager(ISagaPersistence sagaPersistence, ISagaPublisher sagaPublisher)
 {
     _sagaPersistence = sagaPersistence;
     _sagaPublisher   = sagaPublisher;
 }