A type-safe, observable pipeline framework for building system integrations in .NET.
Every pipeline is a chain of typed steps — deserialize, validate, transform, serialize, send — with built-in OpenTelemetry tracing and a result type system that enforces separation between business and technical failures.
Integrations between systems share the same problems: data needs to be moved, transformed, validated, and the failure modes need to be classified. This failure is a bad payload (business problem — route to a person), that failure is a flaky network call (technical problem — retry). Idempotency, observability, and orderly failure handling all need to be wired up consistently.
Intropy.Framework packages the structure: declare your steps, compose them with a builder, and the framework handles execution, tracing, idempotency hooks, and result classification.
| Package | Description |
|---|---|
| Intropy.Framework.Core | Pipeline engine, step abstractions, result types |
| Intropy.Framework.Blocks | Reusable pipeline blocks (Extractor, Loader, Transactional Integration) |
| Intropy.Framework.Adapters | File adapters (SFTP, local, Azure Blob) via Dapr bindings |
| Intropy.Framework.Hosting | Runtime orchestration (Dapr sidecar lifecycle, message subscription, idle timeout) |
| Intropy.Framework.EventDispatcher | Attribute-based CloudEvent routing to typed handlers |
For a full Transactional Integration worker, install Blocks and Hosting.
dotnet add package Intropy.Framework.Blocks
dotnet add package Intropy.Framework.Hostingbuilder.Services.AddIntropyFramework(opts => opts.ComponentName = "order-processor");
builder.Services.AddTransactionalIntegration(opts =>
{
opts.DaprPubSubName = "pubsub";
opts.DaprTopicName = "orders";
});
builder.Services.AddSendPipeline<Order, Invoice, Context>("order-to-invoice",
(pb, sp) => pb
.WithDeserializer(new OrderDeserializer())
.WithValidator(new OrderValidator())
.WithIdempotency(
sp.GetRequiredService<IIdempotencyServiceClient>(),
order => order.OrderId,
order => order.CreatedAt)
.WithTransformer(new OrderToInvoiceTransformer())
.WithSerializer(new InvoiceSerializer())
.WithSender(sp.GetRequiredService<InvoiceApiSender>())
.WithBusinessIncidents(
sp.GetRequiredService<IBusinessIncidentServiceClient>(),
ctx => ctx.Metadata["message_id"]));
var runner = app.Services.GetRequiredService<TransactionalIntegrationRunner>();
return await runner.RunAsync();See the Getting Started guide for the full walkthrough.
- .NET 10 or later
- Dapr sidecar (for the Blocks, Adapters, and Hosting packages)
Full documentation lives in docs/:
- Getting Started — build a complete Transactional Integration from scratch
- Concepts — pipeline execution, result types, step types, observability
- Core — pipeline engine, builders, step types, and result types
- Blocks — Transactional Integration, Extractor, Loader
- Adapters — File adapters via Dapr bindings
- Event Dispatcher — CloudEvent routing
dotnet build Intropy.Framework.slnx
dotnet test Intropy.Framework.slnxMIT © Integrio