public SagaHubActor(IPublisher publisher, IPersistentChildsRecycleConfiguration recycleConf, ISagaProducer <TSaga> sagaProducer) : base(recycleConf, typeof(TSaga).Name) { _acceptMessagesSagaIds = sagaProducer.Descriptor.AcceptMessages.ToDictionary(m => m.MessageType, m => m.CorrelationField); _sagaStartMessages = new HashSet <Type>(sagaProducer.KnownDataTypes.Where(t => typeof(DomainEvent).IsAssignableFrom(t))); _publisher = publisher; }
public SagaActor(ISagaProducer <TSaga> producer, IPublisher publisher, ISnapshotsPersistencePolicy snapshotsPersistencePolicy, IConstructAggregates aggregatesConstructor) : base(aggregatesConstructor, snapshotsPersistencePolicy, publisher) { _producer = producer; _sagaStartMessageTypes = new HashSet <Type>(producer.KnownDataTypes.Where(t => typeof(DomainEvent).IsAssignableFrom(t))); _sagaIdFields = producer.Descriptor.AcceptMessages.ToDictionary(m => m.MessageType, m => m.CorrelationField); //id from name is used due to saga.Data can be not initialized before messages not belonging to current saga will be received Command <IMessageMetadataEnvelop <DomainEvent> >(m => { var msg = m.Message; Monitor.IncrementMessagesReceived(); if (_sagaStartMessageTypes.Contains(msg.GetType())) { _saga = _producer.Create(msg); State = _saga.Data; } ProcessSaga(msg, m.Metadata); }, e => GetSagaId(e.Message) == Id); Command <IMessageMetadataEnvelop <IFault> >(m => { var fault = m.Message; Monitor.IncrementMessagesReceived(); ProcessSaga(fault, m.Metadata); }, fault => fault.Message.SagaId == Id); _sagaProducedEntry = new ProcessEntry(Self.Path.Name, SagaActorLiterals.PublishingCommand, SagaActorLiterals.SagaProducedACommand); _exceptionOnTransit = new ProcessEntry(Self.Path.Name, SagaActorLiterals.CreatedFaultForSagaTransit, SagaActorLiterals.SagaTransitCasedAndError); }