-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
Summary
Add a mechanism to track registered middleware by unique identifiers (ID or name), allowing users to check if a middleware has already been registered and enabling flexible ordering of middleware registration.
Problem Statement
Currently, middleware is registered in a fixed order without any mechanism to identify already-registered middleware. This prevents users from:
- Checking if a specific middleware is already in the pipeline
- Adding middleware out of the recommended order
- Conditionally registering middleware based on what's already registered
Proposed Solution
Implement a middleware registration tracking system that:
- Generates unique identifiers for each registered middleware (based on type name or custom identifier)
- Tracks registered middleware - maintains a collection of registered middleware IDs/names
- Provides query methods - allows users to check if specific middleware has been registered
- Supports optional conflicts - can warn or prevent duplicate registrations if needed
- Documents the feature - provides clear guidance on usage and best practices
Implementation Details
Core Changes
- Add a middleware registry/tracker to
ILambdaInvocationBuilder - Extend middleware registration methods to support ID assignment
- Create utility methods for checking if middleware is registered
API Design
Proposed extension methods:
// Check if middleware by ID is registered
bool IsMiddlewareRegistered(string middlewareId);
// Get list of registered middleware IDs
IReadOnlyList<string> GetRegisteredMiddleware();
// Register middleware with explicit ID
ILambdaInvocationBuilder UseMiddleware(
string middlewareId,
Func<ILambdaHostContext, LambdaInvocationDelegate, Task> middleware
);
// Register middleware with auto-generated ID (e.g., from delegate type)
ILambdaInvocationBuilder UseMiddleware(
Func<ILambdaHostContext, LambdaInvocationDelegate, Task> middleware
);Middleware ID Generation
- For inline delegates: Generate ID from delegate method name or provide explicit ID
- For extension methods (e.g.,
UseClearLambdaOutputFormatting()): Use method name as ID prefix - Allow explicit ID override for custom middleware
Example Usage
var app = new LambdaApplication(host);
// Register with explicit ID
app.UseMiddleware("ClearLambdaOutputFormatting", async (ctx, next) => { /* ... */ });
// Check if middleware is registered
if (!app.IsMiddlewareRegistered("ClearLambdaOutputFormatting"))
{
app.UseClearLambdaOutputFormatting();
}
// User can now add middleware in custom order
app.UseMiddleware(async (ctx, next) => { /* custom middleware */ });Benefits
- Enables conditional middleware registration
- Supports flexible middleware ordering
- Prevents accidental duplicate registrations
- Improves debugging with middleware visibility
- Facilitates middleware discovery
Related Issues
None
Type of Change
- New feature
- Breaking change
- Requires documentation updates
- Requires migration guide
Testing Considerations
- Unit tests for middleware registry operations
- Tests for ID generation and collision handling
- Tests for ordering independence
- Integration tests with existing middleware setup
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels