Back to Workflow Core

Persistence

docs/persistence.md

3.19.03.1 KB
Original Source

Persistence

Since workflows are typically long running processes, they will need to be persisted to storage between steps. There are several persistence providers available as separate Nuget packages.

Implementing a custom persistence provider

To implement a custom persistence provider, create a class that implements IPersistenceProvider interface:

csharp
public interface IPersistenceProvider : IWorkflowRepository, ISubscriptionRepository, IEventRepository, IScheduledCommandRepository
{        
    Task PersistErrors(IEnumerable<ExecutionError> errors, CancellationToken cancellationToken = default);
    void EnsureStoreExists();
}

The IPersistenceProvider interface combines four repository interfaces:

IWorkflowRepository

Handles workflow instance storage and retrieval:

  • CreateNewWorkflow - Create and store a new workflow instance
  • PersistWorkflow - Update an existing workflow instance
  • GetWorkflowInstance - Retrieve a specific workflow instance
  • GetRunnableInstances - Get workflow instances ready for execution

IEventRepository

Manages workflow events:

  • CreateEvent - Store a new event
  • GetEvent - Retrieve a specific event
  • GetRunnableEvents - Get events ready for processing
  • MarkEventProcessed/Unprocessed - Update event status

ISubscriptionRepository

Handles event subscriptions:

  • CreateEventSubscription - Create new event subscription
  • GetSubscriptions - Query subscriptions for events
  • TerminateSubscription - Remove a subscription
  • SetSubscriptionToken/ClearSubscriptionToken - Manage subscription locking

IScheduledCommandRepository

For future command scheduling (optional):

  • ScheduleCommand - Schedule a command for future execution
  • ProcessCommands - Execute scheduled commands
  • SupportsScheduledCommands - Indicates if provider supports this feature

Once implemented, register your provider:

csharp
services.AddWorkflow(options => 
{
    options.UsePersistence(sp => new MyCustomPersistenceProvider());
});