Clean implementation of Result Pattern and error handling for Asp Core Web API applications
$ dotnet add package Resulver.AspNetCore.FastEndpointsResulver.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.
IErrorResponseGenerator into Your EndpointFor 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);
}
}