A source generator that brings clean, class-based endpoints to .NET Minimal APIs. Inspired by FastEndpoints, but source-generated and designed to be as minimal as possible.
- 🚀 Zero Runtime Overhead: Source-generated code with no reflection
- 🏗️ Clean Architecture: Organized, testable endpoint classes
- Nudges you towards REPR Design Pattern (Request-Endpoint-Response) and Vertical Slice Architecture
- 🔧 Full Control: Complete access to
RouteHandlerBuilderandRouteGroupBuilder- it's just Minimal APIs underneath - 📁 Better Organization: Clear project structure with endpoint grouping (check out the example project)
- ✅ Built-In Validation: Support for both DataAnnotations and FluentValidation for request validation
- 🔓 No Lock-In: Copy the generated code and remove the library anytime - you own the output
How It Works (see wiki for more detailed explanation)
- Create endpoint classes implementing one of the endpoint interfaces
- Source generator scans your assembly at compile time
- Generates extension methods for dependency injection and route mapping
- Call the extensions in your
Program.cs:
var builder = WebApplication.CreateBuilder();
builder.AddEndpoints(); // Registers endpoints as services
var app = builder.Build();
app.MapEndpoints(); // Maps all routesThat's it! Your endpoints are now mapped with zero runtime reflection.
You have complete access to the RouteHandlerBuilder, so you can configure endpoints exactly like standard Minimal APIs:
public class HelloWorldEndpoint : IEndpoint<RequestModel, ResponseModel>
{
public static void Configure(RouteHandlerBuilder builder)
{
builder
.Post("/HelloWorld")
.RequestFromBody()
.WithName("CreateHelloWorld") // not necessary - automaticly set for you if not set
.WithTags("HelloWorld") // not necessary - automaticly set for you if not set
.WithSummary("Creates a hello world")
.WithDescription("Creates a new world in the system")
.Produces<ResponseModel>(201)
.Produces(400)
.Produces(409)
.ProducesValidationProblem()
.RequireAuthorization()
.RequireCors("MyPolicy")
.CacheOutput(TimeSpan.FromMinutes(5));
}
public async Task<ResponseModel> Handle(RequestModel request, CancellationToken ct)
{
// Your implementation
return new ResponseModel();
}
}📖 Full Documentation & Examples →
Contributions are welcome! Please feel free to open an issue or submit a Pull Request (start with an issue if it's a significant change).
This project is licensed under the MIT License.