Guia completo de FastEndpoints utilizando C# (.NET 8)

Posted by:

|

On:

|

O que é FastEndpoints ?

FastEndpoints é uma biblioteca para C# que simplifica a criação de APIs HTTP, oferecendo uma alternativa ao ASP.NET minimal APIs, com uma abordagem mais abstraida e modular.

Quais seriam os benefícios de se utilizar essa biblioteca?

Aqui estão alguns benefícios que seriam adquiridos utilizando essa abordagem.

1. Simplicidade e Menos Código

  • O FastEndpoints reduz a quantidade de boilerplate necessária para definir endpoints. Ele permite a definição de endpoints de forma clara e direta, eliminando a necessidade de configurar controllers complexas.

2. Performance Otimizada

  • Projetado para ser rápido e leve, FastEndpoints pode melhorar a performance da API, especialmente em cenários de alta demanda, se comparado a abordagens tradicionais com controllers.

3. Rotas e Validações Automáticas

  • Ele oferece suporte integrado para validações de entrada e saída através de atributos e injeções automáticas de validação. Isso economiza tempo e garante a consistência nas verificações de dados.
  • Rotas também são automaticamente gerenciadas com base na definição dos endpoints, sem a necessidade de escrever manualmente mapeamentos de rotas.

4. Arquitetura de Endpoints Separados

  • Em vez de misturar lógica de negócio com roteamento de API, a biblioteca encoraja a separação da lógica de cada endpoint em classes específicas, o que facilita a manutenção e testes de cada endpoint individualmente.

5. Padronização

  • FastEndpoints oferece uma maneira de padronizar como endpoints são configurados e implementados. Isso ajuda a manter consistência entre desenvolvedores de equipes maiores e projetos maiores.

6. Baixo Acoplamento

  • A biblioteca promove baixo acoplamento, uma vez que a lógica de negócios, validação e configuração de endpoint são claramente separadas em diferentes componentes.

7. Extensibilidade

  • Ele é altamente extensível, o que permite que os desenvolvedores criem suas próprias customizações ou usem middlewares do ASP.NET Core. Você ainda tem acesso total ao pipeline de requisições do ASP.NET.

8. Suporte a Dependency Injection

  • Como faz parte do ecossistema ASP.NET Core, FastEndpoints suporta facilmente Dependency Injection (injeção de dependência), o que é essencial para criar aplicações modulares e testáveis.

9. Versionamento Simples

  • Suporta versionamento de APIs de forma simples, permitindo a criação de diferentes versões de endpoints sem a necessidade de alterar a estrutura do projeto ou criar controladores duplicados.

10. Documentação de API Integrada (OpenAPI/Swagger)

  • FastEndpoints oferece suporte nativo para gerar documentação via Swagger ou OpenAPI, facilitando a criação de documentação interativa e o teste dos endpoints.

Quais seriam as desvantagens de se utilizar essa biblioteca?

Embora o FastEndpoints ofereça vários benefícios para o desenvolvimento de APIs em C#, também existem algumas desvantagens a serem consideradas:

1. Comunidade Menor e Suporte Limitado

  • Comparado com frameworks mais estabelecidos como o ASP.NET Core MVC, o FastEndpoints tem uma comunidade menor. Isso pode resultar em menos recursos disponíveis, como tutoriais, exemplos e suporte da comunidade.

2. Maturidade e Estabilidade

  • Sendo uma biblioteca relativamente nova, pode não ser tão madura ou estável quanto frameworks mais antigos. Isso pode levar a bugs inesperados ou funcionalidades ausentes.

3. Documentação Limitada

  • A documentação pode ser menos abrangente ou detalhada, o que pode dificultar o aprendizado e a resolução de problemas específicos.

4. Menos Recursos e Funcionalidades Avançadas

  • Pode não oferecer todas as funcionalidades avançadas disponíveis em frameworks mais robustos, como suporte a autenticação complexa, internacionalização ou outras extensões.

5. Integração com Terceiros

  • A integração com outras bibliotecas ou ferramentas pode ser mais desafiadora, especialmente se essas ferramentas foram projetadas para funcionar com o ASP.NET Core padrão.

6. Curva de Aprendizado

  • Embora vise simplificar o desenvolvimento, os desenvolvedores acostumados com o ASP.NET Core MVC ou outros frameworks podem enfrentar uma curva de aprendizado ao se adaptar às convenções do FastEndpoints.

7. Risco de Dependência de uma Biblioteca Menor

  • Depender de uma biblioteca mantida por um grupo menor de desenvolvedores pode representar um risco se o projeto não receber atualizações regulares ou for descontinuado.

8. Flexibilidade Reduzida

  • Por ser mais opinativo, o FastEndpoints pode impor certas estruturas e padrões, limitando a flexibilidade para personalizações específicas do projeto.

9. Atualizações e Compatibilidade

  • Atualizações futuras podem introduzir mudanças significativas, exigindo tempo e esforço para manter a compatibilidade com versões anteriores.

10. Escalabilidade a Longo Prazo

  • Em projetos muito grandes ou complexos, pode haver desafios relacionados à organização e manutenção do código, especialmente se a biblioteca não for otimizada para escalabilidade.

Agora que foram apresentados os prós e contras da biblioteca chegou a hora de criarmos um pequeno projeto para ilustrar como podemos usar essa ferramenta no nosso dia-a-dia.

Para isso vamos seguir o seguinte passo a passo e criar uma API em C# .net 8 na qual irá cadastrar uma nova tarefa e também listar as tarefas cadastradas apenas como demonstração de usabilidade da biblioteca.

Pré-requisitos

  • .NET 6 ou superior instalado em sua máquina.
  • Um editor de código, como o Visual Studio 2022 ou Visual Studio Code.

Passo 1: Criar um Novo Projeto

Abra o terminal ou prompt de comando e execute o seguinte comando para criar um novo projeto web:

dotnet new web -n TaskApi

Isto criará uma nova pasta chamada TaskApi com um projeto web básico.

Passo 2: Adicionar Dependências do NuGet

Navegue até a pasta do projeto:

cd TaskApi

Adicione os pacotes necessários:

dotnet add package FastEndpoints
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.InMemory
dotnet add package FastEndpoints.Swagger

Nesse caso como é apenas uma demonstração iremos usar o In Memory Cache do Entity Framework que servira como banco de dados relacional enquanto a aplicação estiver rodando.

Passo 3: Criar o Modelo de Dados

Crie uma classe para representar as tarefas. Crie uma pasta chamada Models e dentro dela, crie o arquivo TaskItem.cs:

Models/TaskItem.cs

    public class TaskItem

    {

        public int Id { get; set; }

        public string? Title { get; set; }

        public bool IsCompleted { get; set; }

    }

Passo 4: Configurar o DbContext

Crie uma classe de contexto para o Entity Framework. Crie uma pasta chamada Data e dentro dela, crie o arquivo TaskDbContext.cs:

Data/TaskDbContext.csPasso 4: Configurar o DbContext

Crie uma classe de contexto para o Entity Framework. Crie uma pasta chamada Data e dentro dela, crie o arquivo TaskDbContext.cs:

Data/TaskDbContext.cs

    public class TaskDbContext : DbContext

    {

        public TaskDbContext(DbContextOptions<TaskDbContext> options)

            : base(options)

        {

        }

        public DbSet<TaskItem> Tasks { get; set; } = null!;

    }

Passo 5: Criar os Endpoints e Requests

Crie uma pasta chamada Endpoints e uma outra pasta chamada Requests e dentro delas, crie os seguintes arquivos: CreateTaskEndpoint.cs e GetTasksEndpoint.cs, na pasta Endpoints e CreateTaskRequest.cs na pasta Requests.

Endpoints/CreateTaskEndpoint.cs

Endpoints/GetTasksEndpoint.cs

Requests/CreateTaskRequest.cs

public class CreateTaskRequest

    {

         public string? Title { get; set; }

    }



public class CreateTaskEndpoint : Endpoint<CreateTaskRequest, TaskItem>

    {

        private readonly TaskDbContext _dbContext;

        public CreateTaskEndpoint(TaskDbContext dbContext)

        {

            _dbContext = dbContext;

        }

        public override void Configure()

        {

            Post(“/tasks”);

            AllowAnonymous();

        }

        public override async Task HandleAsync(CreateTaskRequest req, CancellationToken ct)

        {

            var taskItem = new TaskItem

            {

                Title = req.Title,

                IsCompleted = false

            };

            _dbContext.Tasks.Add(taskItem);

            await _dbContext.SaveChangesAsync(ct);

            await SendAsync(taskItem, cancellation: ct);

        }

    }



public class GetTasksEndpoint : EndpointWithoutRequest<List<TaskItem>>

    {

        private readonly TaskDbContext _dbContext;

        public GetTasksEndpoint(TaskDbContext dbContext)

        {

            _dbContext = dbContext;

        }

        public override void Configure()

        {

            Get(“/tasks”);

            AllowAnonymous();

        }

        public override async Task HandleAsync(CancellationToken ct)

        {

            var tasks = await _dbContext.Tasks.ToListAsync(ct);

            await SendAsync(tasks, cancellation: ct);

        }

    }

Passo 6: Configurar o Programa Principal

Abra o arquivo Program.cs e modifique-o para configurar os serviços e o pipeline de middleware:

using FastEndpoints;

using FastEndpoints.Swagger;

using Microsoft.AspNetCore.Builder;

using Microsoft.EntityFrameworkCore;

using TaskApi.Data;

var builder = WebApplication.CreateBuilder(args);

// Adicionar serviços ao contêiner.

builder.Services.AddDbContext<TaskDbContext>(options =>

    options.UseInMemoryDatabase(“TasksDb”));

// Configurar FastEndpoints

builder.Services.AddFastEndpoints();

// **Registrar o API Explorer**

builder.Services.AddEndpointsApiExplorer();

// Configurar Swagger

builder.Services.AddSwaggerDocument();

var app = builder.Build();

// Configurar o pipeline HTTP

app.UseFastEndpoints();

// Configurar Swagger

app.UseOpenApi();

app.UseSwaggerUi(s => s.ConfigureDefaults());

app.Run();

Passo 7: Executar a Aplicação

No terminal, execute o seguinte comando para iniciar a aplicação:

dotnet run

Verifique a URL retornada e acesse com ctrl + clique do mouse

Digite /swagger em frente a URL para acessar o swagger da aplicação e testar:

preencha o texto com algum titulo de tarefa e execute o endpoint de criação:

Você ira receber um código 200 em caso de sucesso, com as informações da tarefa criada;

Você pode executar o segundo endpoint para listar todas as tarefas criadas:

Com isso terminamos de criar uma API de exemplo utilizando .net 8 como base e também já conseguimos testar o uso do FastEndpoints nessa aplicação, agora vamos dar uma revisada em como isso pode nos ajudar.

Um dos benefícios que posso indicar logo de cara, seria a segregação de endpoints e requests, assim você consegue controlar cada endpoint ao invés de ter uma controller com dezenas de endpoints.

Essa abordagem é ideal para projetos pequenos ou micro serviços, pois vai facilitar no uso do principio de responsabilidade única do SOLID, separando cada endpoint com sua própria responsabilidade.

Aumentando assim a facilidade na manutenção pois as manutenções serão especificas com menor probabilidade de acoplamento de código.

Um ponto negativo dessa abordagem seria a verbosidade que é demandada, uma vez que será necessário escrever mais código.

Considerações Finais

Em suma, o FastEndpoints emerge como uma ferramenta valiosa para desenvolvedores que buscam eficiência e simplicidade na criação de APIs em C#. Ao adotar uma abordagem minimalista e opinativa, ele reduz significativamente o código boilerplate, permitindo que os desenvolvedores foquem na lógica de negócio ao invés de configurações repetitivas. A separação clara entre lógica de negócio e definição de endpoints promove uma arquitetura mais limpa e modular, facilitando a manutenção e escalabilidade do projeto.

Além disso, sua performance otimizada e suporte nativo a recursos como validação automática, versionamento simplificado e documentação integrada via Swagger tornam o desenvolvimento de APIs mais ágil e robusto. A compatibilidade com o ecossistema do ASP.NET Core, incluindo suporte a Dependency Injection e middlewares, garante que os desenvolvedores possam aproveitar o melhor dos dois mundos: a leveza do FastEndpoints e a robustez da plataforma ASP.NET.

Embora seja importante considerar as necessidades específicas de cada projeto e avaliar a maturidade da ferramenta em relação ao ecossistema, o FastEndpoints certamente oferece uma alternativa poderosa para o desenvolvimento rápido e eficiente de APIs RESTful em C#, contribuindo para entregas mais rápidas e código mais sustentável.

Referências

https://fast-endpoints.com/docs/get-started#create-project-install-package