Resulver.AspNetCore.FastEndpoints
is an extension of the Resulver
library that integrates seamlessly with FastEndpoints. It simplifies structured error handling and result management, allowing you to focus on your business logic while the library takes care of consistent responses and error profiles.
To install the Resulver.AspNetCore.FastEndpoints
package, use the following command:
dotnet add package Resulver.AspNetCore.FastEndpoints
Ensure you have the required .NET SDK installed.
To enable Resulver
in your application, add the following code to the Program.cs
file:
builder.Services.AddResulver(Assembly.GetExecutingAssembly());
This registers all error profiles and ensures they are used when generating responses.
Error profiles define how specific error types should be translated into HTTP responses. For example:
-
Define a custom error class:
public class ValidationError(string title, string message) : ResultError(message, title: title);
-
Create an error profile for the custom error:
public class ValidationErrorProfile : ErrorProfile { public override void Configure() { AddError<ValidationError>().WithStatusCode(400); } }
With this profile, any ValidationError
returned in a result will automatically generate a 400 Bad Request
response.
This approach simplifies result handling by using the ResultBaseEndpoint
base class:
public class MyEndpoints : ResultBaseEndpoint<string, string>
{
public override void Configure()
{
Post("my-endpoint");
AllowAnonymous();
}
public override Task HandleAsync(string req, CancellationToken ct)
{
// Logic
var result = new Result<string>("this is result message");
// Return a response generated from the result
return SendFromResultAsync(result, 200, ct);
}
}
Note: If the Result
contains errors, the response will automatically be generated based on the error profile defined for those errors.
For greater flexibility, you can inject IErrorResponseGenerator
to manually handle errors:
public class MyEndpoints : Ep.Req<string>.Res<string>
{
public required IErrorResponseGenerator<FailureResponse> ErrorResponseGenerator { get; init; }
public override void Configure()
{
Post("my-endpoint");
AllowAnonymous();
}
public override Task HandleAsync(string req, CancellationToken ct)
{
// Logic
var result = new Result<string>("this is result message");
if (result.IsFailure)
{
// Generate a failure response for the first error
var failureResponse = ErrorResponseGenerator.MakeResponse(result.Errors[0]);
AddError(failureResponse);
// Send the error response
return SendErrorsAsync(failureResponse.StatusCode, ct);
}
return SendOkAsync(result.Message, ct);
}
}