public sealed class PaymentStateMachine : MassTransitStateMachine<PaymentInstance>
{
public PaymentStateMachine(ILogger logger)
{
// ... Initialization omitted for brevity
During(ImportingFirstStage,
When(FirstStageFinished)
.TransitionTo(ImportingSecondStage)
// Each IImportResourcesInitiator a Command to MassTransit to do some work in another process.
// When that process finishes, an IResourcesImported event is fired.
.Activity(s => s.OfType<IImportResourcesInitiator<PaymentInstance, IImportAddress, PaymentContext>>())
.Activity(s => s.OfType<IImportResourcesInitiator<PaymentInstance, IImportProductSnapshot, PaymentContext>>())
);
During(ImportingSecondStage,
When(PurchaseAddressesFinished)
// Store some data in the Instance, this results in the MongoDbConcurrencyException.
.Then(c => c.Instance.PurchaseAddressesImportSuccessful = c.Data.Succeeded)
.Activity(s => s.OfType<IPostProcessResourcesInitiator<PaymentInstance, IImportAddress>>()),
When(ProductSnapshotsFinished)
// Store some data in the Instance, this results in the MongoDbConcurrencyException.
.Then(c => c.Instance.ProductSnapshotsImportSuccessful = c.Data.Succeeded)
.Activity(s => s.OfType<IPostProcessResourcesInitiator<PaymentInstance, IImportProductSnapshot>>())
);
}
public State ImportingFirstStage { get; private set; }
public State ImportingSecondStage { get; private set; }
public Event<IResourcesImported<IImportAddress>> PurchaseAddressesFinished { get; private set; }
public Event<IResourcesImported<IImportProductSnapshot>> ProductSnapshotsFinished { get; private set; }
}