redb.Route.Controllers 3.3.1

Prefix Reserved
dotnet add package redb.Route.Controllers --version 3.3.1
                    
NuGet\Install-Package redb.Route.Controllers -Version 3.3.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="redb.Route.Controllers" Version="3.3.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="redb.Route.Controllers" Version="3.3.1" />
                    
Directory.Packages.props
<PackageReference Include="redb.Route.Controllers" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add redb.Route.Controllers --version 3.3.1
                    
#r "nuget: redb.Route.Controllers, 3.3.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package redb.Route.Controllers@3.3.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=redb.Route.Controllers&version=3.3.1
                    
Install as a Cake Addin
#tool nuget:?package=redb.Route.Controllers&version=3.3.1
                    
Install as a Cake Tool

redb.Route.Controllers

Transport-agnostic controller dispatch for the redb.Route ESB framework.
Provides a RedbController base class, attribute-based routing, parameter binding, and four dispatcher implementations for generic, HTTP, SignalR, and gRPC transports with 13 DSL extension methods. Controllers are transport-unaware — the same controller class works behind any InOut endpoint.

NuGet License: Apache 2.0

Quick Start

// Define a controller
[Route("orders")]
public class OrdersController : RedbController
{
    [HttpGet("{id}")]
    public Task<Order> GetOrder(int id)
    {
        return Task.FromResult(new Order { Id = id, Title = "Sample" });
    }

    [HttpPost]
    public Task CreateOrder([FromBody] Order order)
    {
        // Access route context and exchange
        var ctx = Context;
        var exchange = Exchange;
        return Task.CompletedTask;
    }
}

// Register and dispatch (generic)
var registry = new ControllerRegistry();
registry.RegisterAssembly(typeof(OrdersController).Assembly);

route.From("direct://api")
     .RedbController(registry);

// Or single controller shorthand
route.From("direct://api")
     .RedbController<OrdersController>();

Architecture

This is not a connector (no IComponent, no URI scheme, no producer/consumer). It is a processing library that provides IProcessor implementations and DSL extension methods. Controllers sit behind direct: or transport endpoints and dispatch based on headers set by the upstream consumer.

HTTP Consumer → [redbHttp.Method, redbHttp.Path] → HttpControllerDispatcher → OrdersController.GetOrder()
SignalR Hub   → [redbSignalR.Method]              → SignalRControllerDispatcher → ChatController.Send()
gRPC Service  → [dispatch-method]                 → GrpcControllerDispatcher → CalcController.Add()
Any Endpoint  → [route.method, route.path]        → ControllerDispatcherProcessor → generic dispatch

RedbController Base Class

All controllers inherit from RedbController, which exposes:

Property Type Description
Context IRouteContext Route context for the current invocation
Exchange IExchange Current exchange being processed

Controllers are instantiated per-request via Activator.CreateInstance(). No DI constructor injection — use Context to access services.

Attributes

Route Attribute

Applied to the controller class. Sets the base path for all actions:

[Route("modules")]           // explicit path
public class ModulesController : RedbController { }

// If omitted, defaults to class name minus "Controller" suffix, lowercased:
public class UsersController : RedbController { }  // base path: "users"

HTTP Method Attributes

Applied to public methods. Define the HTTP method and optional sub-template:

Attribute Method Example
[HttpGet] GET [HttpGet], [HttpGet("{id}")]
[HttpPost] POST [HttpPost], [HttpPost("batch")]
[HttpPut] PUT [HttpPut("{id}")]
[HttpDelete] DELETE [HttpDelete("{id}")]
[HttpPatch] PATCH [HttpPatch("{id}")]

Templates support {param} placeholders that are extracted from the request path and matched to method parameters by name.

Binding Attributes

Attribute Source Example
[FromBody] exchange.In.Body [FromBody] Order order
[FromHeader("X-Tenant")] exchange.In.Headers["X-Tenant"] [FromHeader("X-Tenant")] string tenant
[FromQuery("page")] Query parameter [FromQuery("page")] int page
[FromRoute("id")] Route template {id} [FromRoute("id")] int id
[FromProperty("user")] exchange.Properties["user"] [FromProperty("user")] User user

Implicit binding (no attribute):

  • CancellationTokenCancellationToken.None
  • Parameter name matches a route template {param} → bound from route
  • Complex type → deserialized from body
  • Simple type with default value → uses default

Dispatchers

ControllerDispatcherProcessor (Generic)

Reads route.path and route.method headers. Works with any transport.

// Set headers before dispatch
exchange.In.Headers["route.path"] = "orders/42";
exchange.In.Headers["route.method"] = "GET";

// DSL
route.From("direct://api").RedbController(registry);
route.From("direct://api").RedbController<OrdersController>();
route.From("direct://api").RedbController<OrdersController>("GetOrder"); // direct method call

HttpControllerDispatcher

Reads redbHttp.Method and redbHttp.Path headers (set automatically by the HTTP consumer). Also merges redbHttp.RouteParam.* and reads redbHttp.QueryParam.* for parameter binding.

route.From("http://0.0.0.0:8080/api")
     .RedbHttpController(registry);

route.From("http://0.0.0.0:8080/api")
     .RedbHttpController<OrdersController>();

SignalRControllerDispatcher

Reads redbSignalR.Method header. Parameters are resolved positionally from the exchange body (as sent by the SignalR client).

route.From("signalr://bridge")
     .RedbSignalRController<ChatController>();

// Multiple controllers
route.From("signalr://bridge")
     .RedbSignalRController(typeof(ChatController), typeof(NotificationController));

// Method resolution: "Send" or "Chat.Send" (qualified)

GrpcControllerDispatcher

Reads dispatch-method header from gRPC metadata. Body is treated as JSON — single value or array of positional arguments.

route.From("grpc://0.0.0.0:5000")
     .RedbGrpcController<CalcController>();

// Multiple controllers
route.From("grpc://0.0.0.0:5000")
     .RedbGrpcController(typeof(CalcController), typeof(DataController));

ControllerRegistry

Builds a route lookup table by scanning assemblies or registering individual controller types:

var registry = new ControllerRegistry();

// Scan entire assembly
int count = registry.RegisterAssembly(typeof(OrdersController).Assembly);

// Or register individual controllers
registry.RegisterController(typeof(OrdersController));
registry.RegisterController(typeof(UsersController));

// Resolve manually
var action = registry.Resolve(HttpMethodType.Get, "orders/42", out var routeParams);
// action.ControllerType = typeof(OrdersController)
// action.Method = GetOrder
// routeParams["id"] = "42"

Response Conventions

Scenario status.code Body
Method returns a value 200 Return value (JSON-serialized for HTTP/gRPC)
Method returns null or Task (void) 204
Missing headers 400 ControllerErrorResponse
No matching action 404 ControllerErrorResponse
Exception during invocation 500 ControllerErrorResponse
// Error response model
public sealed class ControllerErrorResponse
{
    public string Error { get; init; }      // e.g. "NotFound", "BadRequest", "InternalError"
    public string Message { get; init; }    // Human-readable description
    public int StatusCode { get; init; }    // HTTP status code
}

DSL Extension Methods

All methods are on IRouteDefinition:

Method Dispatcher Headers Read
RedbController(registry) Generic route.path, route.method
RedbController<T>() Generic route.path, route.method
RedbController<T>(methodName) Direct invoke
RedbController(registry, ctrlName, methodName) Direct invoke
RedbController(registry, ctrlExpr, methodExpr) Dynamic Exchange-dependent
RedbHttpController(registry) HTTP redbHttp.Method, redbHttp.Path
RedbHttpController<T>() HTTP redbHttp.Method, redbHttp.Path
RedbSignalRController<T>() SignalR redbSignalR.Method
RedbSignalRController(types) SignalR redbSignalR.Method
RedbSignalRController(registry) SignalR redbSignalR.Method
RedbGrpcController<T>() gRPC dispatch-method
RedbGrpcController(types) gRPC dispatch-method
RedbGrpcController(registry) gRPC dispatch-method

Requirements

  • .NET 8.0 / 9.0 / 10.0
  • redb.Route (core) — no external dependencies
Product 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 is compatible.  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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on redb.Route.Controllers:

Package Downloads
redb.Route.Core

Bridge package connecting redb.Route ESB framework with redb.Core EAV storage. Provides RedbIdempotentRepository, typed access to IRedbService from route pipelines, and extension methods for redb.Core integration.

redb.Identity.Http

HTTP / HTTPS facade for redb.Identity — OIDC discovery, token, authorize, userinfo, introspect, revoke, JWKS, PAR, DCR, SCIM, /me and management endpoints.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.3.1 178 7/10/2026
3.3.0 114 7/8/2026
3.2.0 206 6/29/2026
3.1.0 261 6/6/2026
3.0.1 149 6/3/2026
3.0.0 143 5/29/2026
2.0.2 173 5/16/2026
2.0.0 143 5/6/2026