< Summary

Information
Class: NexMediator.Pipeline.Behaviors.TransactionBehavior<T1, T2>
Assembly: NexMediator.Pipeline
File(s): /home/runner/work/NexMediator/NexMediator/src/NexMediator.Pipeline/Behaviors/TransactionBehavior.cs
Line coverage
100%
Covered lines: 25
Uncovered lines: 0
Coverable lines: 25
Total lines: 57
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%44100%
Handle()100%22100%

File(s)

/home/runner/work/NexMediator/NexMediator/src/NexMediator.Pipeline/Behaviors/TransactionBehavior.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using NexMediator.Abstractions.Interfaces;
 3
 4namespace NexMediator.Pipeline.Behaviors;
 5
 6/// <summary>
 7/// Pipeline behavior that handles transactions for commands only.
 8/// </summary>
 9/// <typeparam name="TRequest">The request type.</typeparam>
 10/// <typeparam name="TResponse">The response type.</typeparam>
 11public class TransactionBehavior<TRequest, TResponse> : INexPipelineBehavior<TRequest, TResponse>
 12    where TRequest : INexRequest<TResponse>
 13{
 14    private readonly ITransactionManager _transactionManager;
 15    private readonly ILogger<TransactionBehavior<TRequest, TResponse>> _logger;
 16
 1017    public TransactionBehavior(
 1018        ITransactionManager transactionManager,
 1019        ILogger<TransactionBehavior<TRequest, TResponse>> logger)
 1020    {
 1021        _transactionManager = transactionManager ?? throw new ArgumentNullException(nameof(transactionManager));
 922        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
 823    }
 24
 25    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken canc
 526    {
 27
 528        if (request is not INexCommand<TResponse>)
 129        {
 130            _logger.LogDebug("Skipping transaction for non-command request {RequestType}", typeof(TRequest).Name);
 131            return await next();
 32        }
 33
 434        await _transactionManager.BeginTransactionAsync(cancellationToken);
 35
 36        try
 437        {
 438            _logger.LogDebug("Started transaction for command {RequestType}", typeof(TRequest).Name);
 39
 440            var response = await next();
 41
 242            await _transactionManager.CommitTransactionAsync(cancellationToken);
 43
 244            _logger.LogDebug("Committed transaction for command {RequestType}", typeof(TRequest).Name);
 45
 246            return response;
 47        }
 248        catch (Exception ex)
 249        {
 250            await _transactionManager.RollbackTransactionAsync(cancellationToken);
 51
 252            _logger.LogWarning(ex, "Rolled back transaction for command {RequestType} due to error", typeof(TRequest).Na
 53
 254            throw;
 55        }
 356    }
 57}