Desenvolvendo APIs

As APIs são a principal forma de expor funcionalidades de um serviço no ecossistema Lino.
Este capítulo descreve como o framework gera Minimal APIs prontas para uso, como ocorre o registro automático via Source Generators, e quais práticas recomendamos para criar endpoints claros, testáveis e bem documentados.

Minimal APIs

O Lino adota o estilo Minimal API como padrão para geração de endpoints, priorizando:

  • Clareza – código enxuto, direto e expressivo.
  • Performance – respostas otimizadas, sem overhead desnecessário.

Recursos integrados

TypedResults: garantem respostas fortemente tipadas, auxiliando na legibilidade e na geração de OpenAPI.

Versionamento de APIs: endpoints podem ser evoluídos sem quebrar compatibilidade.

Documentação enriquecida: metadados configuráveis são incorporados diretamente no OpenAPI, incluindo:

  • WithTags → agrupa endpoints em seções lógicas no OpenAPI.
  • WithName → define o operationId de forma consistente.
  • WithSummary → descreve claramente o propósito do endpoint.
  • Produces(statusCode, schema) → especifica códigos de status e contratos de resposta.
  • MapToApiVersion → permite expor diferentes versões do mesmo endpoint.

Requests e Responses

Record classes são utilizadas para Requests e Responses por padrão:

  • São imutáveis (reduzindo efeitos colaterais e bugs).
  • São concisas e de fácil leitura.

Integração com CQRS:

  • Requests recebidos via endpoints são transformados em Commands ou Queries.
  • Os resultados de Commands/Queries são convertidos em Responses, promovendo consistência arquitetural.

Exemplo simplificado:
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

Criando novas APIs

Criar um endpoint com a CLI do Lino é simples:

lino new api

O assistente interativo solicitará:

  • Serviço – serviço no qual a API será criada.
  • Módulo – módulo do serviço (quando aplicável).
  • Entidade – entidade associada ao endpoint.
  • Nome da API – normalmente alinhado ao verbo da operação (ex.: CreatePerson).
  • Tipo de operação – POST, PUT, PATCH, DELETE ou GET.
  • Rota – padrão de rota (ex.: /people/{id}).

Exemplo:

Ao criar uma API POST chamada CreatePerson, associada à entidade Person, o CLI gera automaticamente:

  • Endpoint com mapeamento HTTP.
  • DTOs de Request e Response.
  • Extensions para integração com OpenAPI e versionamento.

Estrutura gerada:

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Api/
                └── MyApp.MyService.Api.csproj
                    └── Endpoints/
                        └── People/
                            └── CreatePerson/
                                ├── CreatePersonEndpoint.cs
                                ├── CreatePersonExtensions.cs
                                ├── CreatePersonRequest.cs
                                └── CreatePersonResponse.cs

Nos projetos que possuem aplicações Web Blazor adicionadas, o Lino gera automaticamente os artefatos necessários para o consumo das APIs.
Isso inclui os contratos compartilhados (Request e Response/DTOs), a interface do client e uma implementação padrão para chamadas HTTP, permitindo que o Blazor consuma as APIs de forma simples, tipada e consistente.

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Api/
                ├── MyApp.MyService.Api.Contracts.csproj
                │   └── Features/
                │       └── People/
                │           ├── CreatePerson/
                │           │   ├── CreatePersonRequest.cs
                │           │   └── CreatePersonResponse.cs
                │           └── IPersonApiClient.cs
                └── MyApp.MyService.Api.Client.csproj
                    └── Features/
                        └── PersonApiClient.cs

Registro de Endpoints com Source Generators

O Lino elimina a necessidade de mapeamento manual de endpoints ou uso intensivo de Reflection em tempo de execução.
Em vez disso, utiliza Source Generators para produzir automaticamente o código de registro durante a compilação.

Como funciona

Para cada endpoint criado, o generator gera classes/parciais que chamam:
MapGet, MapPost, MapPut, MapDelete, etc.

Isso substitui a necessidade de adicionar manualmente todos os mapeamentos em Program.cs.

Vantagens:

  • Registro em tempo de compilação → evita erros de runtime.
  • Program.cs enxuto → menor superfície de configuração manual.
  • Compatibilidade AOT → elimina dependência de Reflection.
  • Documentação integrada → metadados (tags, summary, produces) são gerados junto ao mapeamento.

Esse modelo garante que as APIs criadas no Lino sejam:

  • Auto-documentadas
  • Performáticas
  • Consistentes com a arquitetura CQRS do framework.
Ocorreu um erro não tratado. Recarregar 🗙