ND.FW.PipelineOrchestrator
1.0.2
dotnet add package ND.FW.PipelineOrchestrator --version 1.0.2
NuGet\Install-Package ND.FW.PipelineOrchestrator -Version 1.0.2
<PackageReference Include="ND.FW.PipelineOrchestrator" Version="1.0.2" />
<PackageVersion Include="ND.FW.PipelineOrchestrator" Version="1.0.2" />
<PackageReference Include="ND.FW.PipelineOrchestrator" />
paket add ND.FW.PipelineOrchestrator --version 1.0.2
#r "nuget: ND.FW.PipelineOrchestrator, 1.0.2"
#:package ND.FW.PipelineOrchestrator@1.0.2
#addin nuget:?package=ND.FW.PipelineOrchestrator&version=1.0.2
#tool nuget:?package=ND.FW.PipelineOrchestrator&version=1.0.2
ND.FW.PipelineOrchestrator
Staged, ordered pipeline execution for Novacis Digital services, with built-in
distributed tracing via ND.FW.Observability
(INDTracerService). Cross-cutting span/trace instrumentation is handled by the
framework, so application code doesn't need to write any bespoke tracing logic
around its stages.
What it does
- Executes a set of
IPipelineStage<TPayload>implementations inOrder. - Two context-propagation modes between stages:
SharedContext(default) — every stage'sOutputis merged intocontext.Extensions, accumulating across the whole run.DerivedContext— each stage's first output value becomescontext.Current, feeding forward into the next stage.
- Wraps the whole run in a root trace span, and each stage in a child span, automatically tagging duration, outcome, and error details.
- Emits
System.Diagnostics.DiagnosticListenerevents (Pipeline.Start,Stage.Enter,Stage.Success,Stage.Failed,Stage.Exception,Stage.Cancelled,Pipeline.Completed,Pipeline.Failed) for anyone listening in-process, independent of the tracer. - Stops on the first stage failure or unhandled exception — no partial/best-effort continuation past a failed stage.
What it does not do
- It doesn't retry stages. If a stage needs retry semantics, build that into the stage implementation itself.
- It doesn't validate that stage
Ordervalues are unique or contiguous — stages just run in ascendingOrder. - Tracing is a no-op if no
IPipelineTraceris supplied (all tracer calls are null-conditional), so the package works standalone withoutND.FW.Observabilitywired up at runtime — but the package reference itself is required at compile time.
Install
dotnet add package ND.FW.PipelineOrchestrator
Usage
using PipelineOrchestrator.Abstractions;
using PipelineOrchestrator.Contracts;
using PipelineOrchestrator.Core;
// 1. Implement your stages
public sealed class ValidateStage : IPipelineStage<OrderPayload>
{
public string StageName => "Validate";
public int Order => 0;
public bool IsEnabled => true;
public Task<StageResult> ExecuteAsync(PipelineContext<OrderPayload> context, CancellationToken ct)
{
var isValid = context.Payload.Total > 0;
return Task.FromResult(new StageResult
{
Success = isValid,
StageName = StageName,
ErrorCode = isValid ? null : "INVALID_ORDER",
Outcome = isValid ? StageOutcome.Continue : StageOutcome.Stop
});
}
}
// 2. Wire up the pipeline (tracer is optional — pass null to run untraced)
var pipeline = new Pipeline<OrderPayload>(
stages: new IPipelineStage<OrderPayload>[] { new ValidateStage(), /* ... */ },
tracer: pipelineTracer); // IPipelineTracer, backed by ND.FW.Observability's INDTracerService
// 3. Execute
var context = new PipelineContext<OrderPayload> { Payload = order };
var result = await pipeline.Execute(context, PipelineExecutionMode.SharedContext, ct);
if (!result.Success)
{
// result.FailedStage, result.ErrorCode, result.StageResults are populated
}
Tracing setup
PipelineTracer wraps an INDTracerService (from ND.FW.Observability) and
implements IPipelineTracer:
IPipelineTracer tracer = new PipelineTracer(ndTracerService);
If you don't need tracing, omit the tracer argument (or pass null) —
Pipeline<TPayload> treats it as optional and skips all span creation.
Execution modes
| Mode | Behavior |
|---|---|
SharedContext |
All stage outputs accumulate into context.Extensions across the run. |
DerivedContext |
Each stage's first output value replaces context.Current for the next. |
Dependencies
ND.FW.Observability(0.0.8) — required at compile time forINDTracerService; must already be published to the GitLab Package Registry before this package is restored (see publish order below).Microsoft.Extensions.Logging/Microsoft.Extensions.Logging.Console
ND.FW.Observability must be published before this package can restore in CI.
Versioning
Package version is set at pack time and is not hardcoded in source:
dotnet pack /p:Version=$VERSION
License
Internal Novacis Digital package. Not for external distribution.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Microsoft.Extensions.Logging (>= 9.0.0)
- Microsoft.Extensions.Logging.Console (>= 8.0.0)
- ND.FW.Observability (>= 0.0.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.