public void PersistSagasWith(ISagaPersistence sagaPersistence) { _graph.SagaPersistence = sagaPersistence; }
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); }
public SagaManager(ISagaPersistence sagaPersistence, ISagaPublisher sagaPublisher) { _sagaPersistence = sagaPersistence; _sagaPublisher = sagaPublisher; }