Class EfCoreGovernanceOutboxOutcomeStore
- Namespace
- AsiBackbone.EntityFrameworkCore.Outbox
- Assembly
- AsiBackbone.EntityFrameworkCore.dll
EF Core outbox store that exposes explicit caller-owned claim transition outcomes.
public sealed class EfCoreGovernanceOutboxOutcomeStore : IGovernanceOutboxClaimOutcomeStore, IGovernanceOutboxClaimStore, IGovernanceOutboxStore
- Inheritance
-
EfCoreGovernanceOutboxOutcomeStore
- Implements
- Inherited Members
Remarks
This store preserves the existing convenience API while adding an outcome-aware contract that distinguishes applied transitions from stale claims, terminal no-ops, concurrency losses, and missing rows. It delegates persistence to EfCoreGovernanceOutboxStore and observes the scoped DbContext save boundary so callers do not infer write ownership from the returned durable status alone.
Constructors
EfCoreGovernanceOutboxOutcomeStore(DbContext, ILogger<EfCoreGovernanceOutboxOutcomeStore>?)
Initializes a new instance of the EfCoreGovernanceOutboxOutcomeStore class.
public EfCoreGovernanceOutboxOutcomeStore(DbContext dbContext, ILogger<EfCoreGovernanceOutboxOutcomeStore>? logger = null)
Parameters
dbContextDbContextThe host-owned scoped database context.
loggerILogger<EfCoreGovernanceOutboxOutcomeStore>The logger used for non-applied claimed-transition diagnostics.
Methods
ClaimPendingAsync(GovernanceOutboxClaimRequest, CancellationToken)
Claims pending entries ordered for delivery.
public ValueTask<IReadOnlyList<GovernanceOutboxClaim>> ClaimPendingAsync(GovernanceOutboxClaimRequest request, CancellationToken cancellationToken = default)
Parameters
requestGovernanceOutboxClaimRequestcancellationTokenCancellationToken
Returns
ClaimRetryReadyAsync(GovernanceOutboxClaimRequest, CancellationToken)
Claims retry-ready entries ordered for delivery.
public ValueTask<IReadOnlyList<GovernanceOutboxClaim>> ClaimRetryReadyAsync(GovernanceOutboxClaimRequest request, CancellationToken cancellationToken = default)
Parameters
requestGovernanceOutboxClaimRequestcancellationTokenCancellationToken
Returns
EnqueueAsync(GovernanceEmissionEnvelope, CancellationToken)
Enqueues a provider-neutral governance emission envelope before optional downstream provider delivery is attempted.
public ValueTask<GovernanceOutboxEntry> EnqueueAsync(GovernanceEmissionEnvelope envelope, CancellationToken cancellationToken = default)
Parameters
envelopeGovernanceEmissionEnvelopecancellationTokenCancellationToken
Returns
Remarks
Implementations should persist a new pending state record with a stable outbox entry identifier. Provider emission remains downstream and should be treated as at-least-once unless the host and provider supply stronger guarantees.
FindByOutboxEntryIdAsync(string, CancellationToken)
Finds an outbox entry by its stable identifier.
public ValueTask<GovernanceOutboxEntry?> FindByOutboxEntryIdAsync(string outboxEntryId, CancellationToken cancellationToken = default)
Parameters
outboxEntryIdstringcancellationTokenCancellationToken
Returns
FindPendingAsync(int, CancellationToken)
Finds pending outbox entries ordered for delivery.
public ValueTask<IReadOnlyList<GovernanceOutboxEntry>> FindPendingAsync(int maxCount = 100, CancellationToken cancellationToken = default)
Parameters
maxCountintcancellationTokenCancellationToken
Returns
Remarks
Returned entries are candidates, not claimed work items. A multi-worker host should use a storage adapter or deployment pattern that claims or partitions work before provider emission.
FindRetryReadyAsync(DateTimeOffset, int, CancellationToken)
Finds retry-ready outbox entries ordered for delivery.
public ValueTask<IReadOnlyList<GovernanceOutboxEntry>> FindRetryReadyAsync(DateTimeOffset utcNow, int maxCount = 100, CancellationToken cancellationToken = default)
Parameters
utcNowDateTimeOffsetmaxCountintcancellationTokenCancellationToken
Returns
Remarks
Returned entries are candidates, not claimed work items. A multi-worker host should use a storage adapter or deployment pattern that claims or partitions work before provider emission.
MarkClaimDeadLetteredAsync(GovernanceOutboxClaim, GovernanceEmissionError, string?, CancellationToken)
Completes a claimed entry as dead-lettered when the claim token still matches.
public ValueTask<GovernanceOutboxEntry> MarkClaimDeadLetteredAsync(GovernanceOutboxClaim claim, GovernanceEmissionError governanceEmissionError, string? deadLetterReason = null, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimgovernanceEmissionErrorGovernanceEmissionErrordeadLetterReasonstringcancellationTokenCancellationToken
Returns
MarkClaimDeliveredAsync(GovernanceOutboxClaim, GovernanceEmissionResult, CancellationToken)
Completes a claimed entry as delivered when the claim token still matches.
public ValueTask<GovernanceOutboxEntry> MarkClaimDeliveredAsync(GovernanceOutboxClaim claim, GovernanceEmissionResult result, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimresultGovernanceEmissionResultcancellationTokenCancellationToken
Returns
MarkClaimFailedAsync(GovernanceOutboxClaim, GovernanceEmissionError, DateTimeOffset?, CancellationToken)
Completes a claimed entry as failed or retryable failed when the claim token still matches.
public ValueTask<GovernanceOutboxEntry> MarkClaimFailedAsync(GovernanceOutboxClaim claim, GovernanceEmissionError governanceEmissionError, DateTimeOffset? nextRetryUtc = null, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimgovernanceEmissionErrorGovernanceEmissionErrornextRetryUtcDateTimeOffset?cancellationTokenCancellationToken
Returns
MarkDeadLetteredAsync(string, GovernanceEmissionError, string?, CancellationToken)
Marks an outbox entry as dead-lettered.
public ValueTask<GovernanceOutboxEntry> MarkDeadLetteredAsync(string outboxEntryId, GovernanceEmissionError governanceEmissionError, string? deadLetterReason = null, CancellationToken cancellationToken = default)
Parameters
outboxEntryIdstringgovernanceEmissionErrorGovernanceEmissionErrordeadLetterReasonstringcancellationTokenCancellationToken
Returns
Remarks
This is a non-claim mutation. Implementations may propagate a storage-provider optimistic-concurrency exception when another writer changes the same durable entry before this transition commits. No hidden retry or winner-state recovery is implied; the caller owns reload and conflict resolution. Competing workers should prefer a claim-capable store.
MarkDeliveredAsync(string, GovernanceEmissionResult, CancellationToken)
Marks an outbox entry as delivered using a provider-neutral emission result.
public ValueTask<GovernanceOutboxEntry> MarkDeliveredAsync(string outboxEntryId, GovernanceEmissionResult result, CancellationToken cancellationToken = default)
Parameters
outboxEntryIdstringresultGovernanceEmissionResultcancellationTokenCancellationToken
Returns
Remarks
This is a non-claim mutation. Implementations may propagate a storage-provider optimistic-concurrency exception when another writer changes the same durable entry before this transition commits. No hidden retry or winner-state recovery is implied; the caller owns reload and conflict resolution. Competing workers should prefer a claim-capable store.
MarkFailedAsync(string, GovernanceEmissionError, DateTimeOffset?, CancellationToken)
Marks an outbox entry as failed or retryable failed using provider-neutral error information.
public ValueTask<GovernanceOutboxEntry> MarkFailedAsync(string outboxEntryId, GovernanceEmissionError governanceEmissionError, DateTimeOffset? nextRetryUtc = null, CancellationToken cancellationToken = default)
Parameters
outboxEntryIdstringgovernanceEmissionErrorGovernanceEmissionErrornextRetryUtcDateTimeOffset?cancellationTokenCancellationToken
Returns
Remarks
This is a non-claim mutation. Implementations may propagate a storage-provider optimistic-concurrency exception when another writer changes the same durable entry before this transition commits. No hidden retry or winner-state recovery is implied; the caller owns reload and conflict resolution. Competing workers should prefer a claim-capable store.
ReleaseClaimAsync(GovernanceOutboxClaim, string?, CancellationToken)
Releases a claim without changing provider emission state when the claim token still matches.
public ValueTask<GovernanceOutboxEntry?> ReleaseClaimAsync(GovernanceOutboxClaim claim, string? reason = null, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimreasonstringcancellationTokenCancellationToken
Returns
SaveAsync(GovernanceOutboxEntry, CancellationToken)
Saves an updated outbox entry state.
public ValueTask<GovernanceOutboxEntry> SaveAsync(GovernanceOutboxEntry entry, CancellationToken cancellationToken = default)
Parameters
entryGovernanceOutboxEntrycancellationTokenCancellationToken
Returns
Remarks
Implementations should store the latest state for the entry's stable identifier. For durable providers that support it, saving an already-known OutboxEntryId should update the existing row rather than append a second logical outbox entry. Concurrent duplicate inserts may still surface provider-specific duplicate-key or concurrency exceptions that the host must reconcile.
This is a non-claim mutation. Implementations may propagate storage-provider optimistic-concurrency exceptions without retrying or translating another writer's state into caller success. The caller owns conflict detection, reload, retry, merge, or abandonment according to its idempotency and transaction model.
SaveClaimAsync(GovernanceOutboxClaim, GovernanceOutboxEntry, CancellationToken)
Saves a claimed entry transition, such as provider-directed deferred state, when the claim token still matches.
public ValueTask<GovernanceOutboxEntry> SaveClaimAsync(GovernanceOutboxClaim claim, GovernanceOutboxEntry entry, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimentryGovernanceOutboxEntrycancellationTokenCancellationToken
Returns
TryMarkClaimDeadLetteredAsync(GovernanceOutboxClaim, GovernanceEmissionError, string?, CancellationToken)
Attempts to complete a claimed entry as dead-lettered and reports whether this invocation applied the transition.
public ValueTask<GovernanceOutboxClaimTransitionResult> TryMarkClaimDeadLetteredAsync(GovernanceOutboxClaim claim, GovernanceEmissionError governanceEmissionError, string? deadLetterReason = null, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimgovernanceEmissionErrorGovernanceEmissionErrordeadLetterReasonstringcancellationTokenCancellationToken
Returns
TryMarkClaimDeliveredAsync(GovernanceOutboxClaim, GovernanceEmissionResult, CancellationToken)
Attempts to complete a claimed entry as delivered and reports whether this invocation applied the transition.
public ValueTask<GovernanceOutboxClaimTransitionResult> TryMarkClaimDeliveredAsync(GovernanceOutboxClaim claim, GovernanceEmissionResult result, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimresultGovernanceEmissionResultcancellationTokenCancellationToken
Returns
TryMarkClaimFailedAsync(GovernanceOutboxClaim, GovernanceEmissionError, DateTimeOffset?, CancellationToken)
Attempts to complete a claimed entry as failed or retryable failed and reports whether this invocation applied the transition.
public ValueTask<GovernanceOutboxClaimTransitionResult> TryMarkClaimFailedAsync(GovernanceOutboxClaim claim, GovernanceEmissionError governanceEmissionError, DateTimeOffset? nextRetryUtc = null, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimgovernanceEmissionErrorGovernanceEmissionErrornextRetryUtcDateTimeOffset?cancellationTokenCancellationToken
Returns
TrySaveClaimAsync(GovernanceOutboxClaim, GovernanceOutboxEntry, CancellationToken)
Attempts to save a caller-produced claimed transition and reports whether this invocation applied the transition.
public ValueTask<GovernanceOutboxClaimTransitionResult> TrySaveClaimAsync(GovernanceOutboxClaim claim, GovernanceOutboxEntry entry, CancellationToken cancellationToken = default)
Parameters
claimGovernanceOutboxClaimentryGovernanceOutboxEntrycancellationTokenCancellationToken