< Summary

Information
Class: ProjectTemplate.Infrastructure.Data.ContextIsolatedApplicationSaveChangesPipeline
Assembly: ProjectTemplate.Infrastructure
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/ContextIsolatedApplicationSaveChangesPipeline.cs
Line coverage
90%
Covered lines: 37
Uncovered lines: 4
Coverable lines: 41
Total lines: 94
Line coverage: 90.2%
Branch coverage
100%
Covered branches: 2
Total branches: 2
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%11100%
ApplyBeforeSaveChanges(...)100%210%
ApplyBeforeSaveChangesAsync(...)100%11100%
ApplyAfterSaveChanges(...)100%210%
ApplyAfterSaveChangesAsync(...)100%11100%
GetLastCompletedReceipt(...)100%22100%
GetPipeline(...)100%11100%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/ContextIsolatedApplicationSaveChangesPipeline.cs

#LineLine coverage
 1using System.Runtime.CompilerServices;
 2using Microsoft.Extensions.Options;
 3using ProjectTemplate.Infrastructure.Data.Auditing;
 4using ProjectTemplate.Infrastructure.Data.Options;
 5
 6namespace ProjectTemplate.Infrastructure.Data;
 7
 8/// <summary>
 9/// Routes save lifecycle callbacks to one mutable pipeline instance per application database context.
 10/// </summary>
 11internal sealed class ContextIsolatedApplicationSaveChangesPipeline :
 12    IApplicationSaveChangesPipeline,
 13    IApplicationMutationAuditReceiptRegistry
 14{
 1615    private readonly ConditionalWeakTable<ApplicationDbContext, ApplicationSaveChangesPipeline> _pipelines = [];
 16    private readonly ICurrentActorAccessor _currentActorAccessor;
 17    private readonly IOptions<DataAccessOptions> _dataAccessOptions;
 18    private readonly IApplicationAuditStore? _auditStore;
 19    private readonly IApplicationAuditContextAccessor? _auditContextAccessor;
 20    private readonly IApplicationAuditValuePolicy? _auditValuePolicy;
 21    private readonly IApplicationMutationManifestBuilder _manifestBuilder;
 22    private readonly IApplicationMutationManifestHasher _manifestHasher;
 23
 1624    public ContextIsolatedApplicationSaveChangesPipeline(
 1625        ICurrentActorAccessor currentActorAccessor,
 1626        IOptions<DataAccessOptions> dataAccessOptions,
 1627        IApplicationMutationManifestBuilder manifestBuilder,
 1628        IApplicationMutationManifestHasher manifestHasher,
 1629        IApplicationAuditStore? auditStore = null,
 1630        IApplicationAuditContextAccessor? auditContextAccessor = null,
 1631        IApplicationAuditValuePolicy? auditValuePolicy = null)
 32    {
 1633        ArgumentNullException.ThrowIfNull(currentActorAccessor);
 1634        ArgumentNullException.ThrowIfNull(dataAccessOptions);
 1635        ArgumentNullException.ThrowIfNull(manifestBuilder);
 1636        ArgumentNullException.ThrowIfNull(manifestHasher);
 37
 1638        _currentActorAccessor = currentActorAccessor;
 1639        _dataAccessOptions = dataAccessOptions;
 1640        _auditStore = auditStore;
 1641        _auditContextAccessor = auditContextAccessor;
 1642        _auditValuePolicy = auditValuePolicy;
 1643        _manifestBuilder = manifestBuilder;
 1644        _manifestHasher = manifestHasher;
 1645    }
 46
 47    public bool ApplyBeforeSaveChanges(ApplicationDbContext dbContext)
 48    {
 049        ArgumentNullException.ThrowIfNull(dbContext);
 050        return GetPipeline(dbContext).ApplyBeforeSaveChanges(dbContext);
 51    }
 52
 53    public ValueTask<bool> ApplyBeforeSaveChangesAsync(
 54        ApplicationDbContext dbContext,
 55        CancellationToken cancellationToken = default)
 56    {
 457        ArgumentNullException.ThrowIfNull(dbContext);
 458        return GetPipeline(dbContext).ApplyBeforeSaveChangesAsync(dbContext, cancellationToken);
 59    }
 60
 61    public bool ApplyAfterSaveChanges(ApplicationDbContext dbContext)
 62    {
 063        ArgumentNullException.ThrowIfNull(dbContext);
 064        return GetPipeline(dbContext).ApplyAfterSaveChanges(dbContext);
 65    }
 66
 67    public ValueTask<bool> ApplyAfterSaveChangesAsync(
 68        ApplicationDbContext dbContext,
 69        CancellationToken cancellationToken = default)
 70    {
 471        ArgumentNullException.ThrowIfNull(dbContext);
 472        return GetPipeline(dbContext).ApplyAfterSaveChangesAsync(dbContext, cancellationToken);
 73    }
 74
 75    public ApplicationMutationAuditReceipt? GetLastCompletedReceipt(ApplicationDbContext dbContext)
 76    {
 677        ArgumentNullException.ThrowIfNull(dbContext);
 678        return _pipelines.TryGetValue(dbContext, out ApplicationSaveChangesPipeline? pipeline)
 679            ? pipeline.LastCompletedReceipt
 680            : null;
 81    }
 82
 83    private ApplicationSaveChangesPipeline GetPipeline(ApplicationDbContext dbContext)
 84    {
 1285        return _pipelines.GetValue(dbContext, _ => new ApplicationSaveChangesPipeline(
 1286            _currentActorAccessor,
 1287            _dataAccessOptions,
 1288            _auditStore,
 1289            _auditContextAccessor,
 1290            _auditValuePolicy,
 1291            _manifestBuilder,
 1292            _manifestHasher));
 93    }
 94}