Skip to content
Purview Dev logo

Provider Capabilities

Preview Event Sourcing Reviewed 2026-09-05 purview-dev/event-sourcing Star on GitHub 4 aggregates azure-cosmosdb azure-storage cqrs csharp ddd dotnet event-driven event-sourcing event-store mongodb postgresql roslyn snapshots source-generator sql-server transactions

Event-store capabilities are exposed as a provider-neutral, queryable contract so applications and Admin tooling can determine actual guarantees instead of inferring them from a provider name.

Resolve IEventStoreCapabilitiesProvider from dependency injection:

public sealed class StoreHealth(IEventStoreCapabilitiesProvider capabilitiesProvider)
{
public void Report()
{
var capabilities = capabilitiesProvider.GetCapabilities();
var guarantee = capabilities.TransactionGuarantee;
var preservesMetadata = capabilities.PreservedMetadata;
}
}

Capability discovery never constructs a store or probes live storage; it only reads what was registered. IEventStoreCapabilitiesProvider is always resolvable after AddEventSourcing() and reports the conservative EventStoreCapabilities.Default until a provider registers its capabilities.

MemberMeaning
TransactionGuaranteeEventStoreTransactionGuarantee.Atomic or .BestEffort (the same abstraction used by transaction options).
SupportsEventStreamsWhether the provider persists an append-only event stream.
SupportsSnapshotsWhether the provider stores aggregate snapshots (replay cache or query store).
SnapshotSchemaVersioningNone, SingleVersion (legacy single-shape layout), or Versioned (honors [SnapshotSchemaVersion]).
PreservedMetadataFlags for which event metadata fields are persisted: SchemaVersion, CorrelationId, CausationId, UserId, IdempotencyId, AggregateVersion, When.
SupportsQueriesWhether a queryable snapshot store is available through IQueryableEventStore.
SupportsIdempotencyMarkersWhether saves deduplicate on an idempotency marker.
ConcurrencyOptimistic (conflicts rejected) or LastWriterWins.
OperationalLimitationsStable limitation identifiers, for example non-persistent (InMemory) and no-event-stream (Cosmos DB).

Built-in providers register their truthful capabilities from their Add*EventStore extension methods. Multiple registrations for the same provider are merged into the union of what is actually available (for example SQL Server event store + snapshot query store report atomic transactions, event streams, snapshots, and queries).

Custom providers register their own capabilities explicitly:

services.AddEventStoreCapabilities(new EventStoreCapabilities(
EventStoreTransactionGuarantee.BestEffort,
SupportsEventStreams: true,
SupportsSnapshots: false,
SnapshotSchemaVersioning: SnapshotSchemaSupport.None,
PreservedMetadata: PreservedEventMetadata.All,
SupportsQueries: false,
SupportsIdempotencyMarkers: false,
Concurrency: ConcurrencyGuarantee.Optimistic,
OperationalLimitations: []
));

Providers that register nothing are reported with EventStoreCapabilities.Default: best-effort transactions, no streams, no snapshots, no queries, no idempotency, and LastWriterWins concurrency. A provider is never assumed to offer stronger behavior than it implements.

The values below are asserted by the Capabilities.UnitTests contract suite so documentation and implementation cannot drift apart.

ProviderTransactionsEvent streamsSnapshotsSnapshot versionsMetadataQueriesIdempotencyConcurrencyTransactional outbox
InMemory event storeBestEffortYesNoNoneAllNoYesOptimisticNo
InMemory snapshot storeBestEffortYesYesSingleVersionAllYesYesOptimisticNo
SQL Server event storeAtomicYesYesVersionedAllNoYesOptimisticYes
SQL Server snapshot query storeAtomicNoYesSingleVersionNoneYesNoOptimisticNo
PostgreSQL event storeAtomicYesYesVersionedAllNoYesOptimisticYes
PostgreSQL snapshot query storeAtomicNoYesSingleVersionNoneYesNoOptimisticNo
Azure StorageBestEffortYesYesVersionedAllNoYesOptimisticNo
MongoDB event storeBestEffortYesYesVersionedAllNoYesOptimisticNo
MongoDB snapshot query storeBestEffortNoYesSingleVersionNoneYesNoOptimisticNo
Cosmos DB snapshot query storeBestEffortNoYesSingleVersionNoneYesNoOptimisticNo

The Provider Feature Matrix summarizes the same facts for package selection.