Class CharacterBuffService
Character buff service with async operations, atomic SQL, and DTO pattern. Uses repository pattern with EF Core and raw SQL for race-condition-prone operations. Implements execution strategies for automatic retry on transient database failures. Returns DatabaseResult for consistent, safe error handling with sanitized messages. Follows SOLID principles: SRP, OCP, LSP, ISP, DIP.
public sealed class CharacterBuffService : BaseService<CharacterBuffEntity>, ICharacterBuffService, IPersistManyAction<CharacterBuffData>, IDeleteByKeyVersionedAction<long>, IFetchCollectionByKeyAction<long, CharacterBuffData>
- Inheritance
-
CharacterBuffService
- Implements
- Inherited Members
Remarks
All methods that use ExecuteSqlRawAsync are wrapped in execution strategies to provide automatic retry logic (up to 3 attempts) for transient database failures such as connection timeouts, deadlocks, or network interruptions.
Exception Handling Strategy:
- Catches specific exceptions (NpgsqlException, DbUpdateException, TimeoutException)
- Converts to custom DatabaseException hierarchy with sanitized messages
- Returns DatabaseResult for safe, typed error handling
- Preserves detailed error information for logging while exposing safe messages to clients
Constructors
CharacterBuffService(INpgsqlDbContextFactory)
Initializes a new instance of the CharacterBuffService class.
public CharacterBuffService(INpgsqlDbContextFactory dbContextFactory)
Parameters
dbContextFactoryINpgsqlDbContextFactoryFactory for creating database contexts.
Exceptions
- ArgumentNullException
Thrown when dbContextFactory is null.
Methods
DeleteAsync(long, long, CancellationToken)
Deletes the entity identified by the given key if incomingVersion is newer.
public Task<DatabaseResult> DeleteAsync(long characterId, long incomingVersion, CancellationToken cancellationToken = default)
Parameters
characterIdlongincomingVersionlongThe authoritative, monotonic version for this delete operation.
cancellationTokenCancellationTokenToken to cancel the operation.
Returns
FetchAsync(long, CancellationToken)
Fetches a collection of items for the given key.
public Task<DatabaseResult<IReadOnlyList<CharacterBuffData>>> FetchAsync(long characterId, CancellationToken cancellationToken = default)
Parameters
characterIdlongcancellationTokenCancellationTokenToken to cancel the operation.
Returns
PersistAsync(IEnumerable<CharacterBuffData>, CancellationToken)
Persists the provided items.
public Task<DatabaseResult<BulkWriteResult>> PersistAsync(IEnumerable<CharacterBuffData> buffs, CancellationToken cancellationToken = default)
Parameters
buffsIEnumerable<CharacterBuffData>cancellationTokenCancellationTokenToken to cancel the operation.
Returns
- Task<DatabaseResult<BulkWriteResult>>
What the write actually did, or a failure.
Remarks
A successful result does not mean every supplied row was written. Batched writes are version-gated and the service filters what it cannot act on, so the outcome carries counts rather than a bare boolean — see BulkWriteResult, which explains which discrepancies a caller should care about and which are routine.