<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Danilo O. Pinheiro, dopme.io</title>
    <description>The latest articles on DEV Community by Danilo O. Pinheiro, dopme.io (@daniloopinheiro).</description>
    <link>https://dev.to/daniloopinheiro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F437505%2F984c8aab-f274-4e0e-bb2d-39af1a462e1c.png</url>
      <title>DEV Community: Danilo O. Pinheiro, dopme.io</title>
      <link>https://dev.to/daniloopinheiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daniloopinheiro"/>
    <language>en</language>
    <item>
      <title>🚀 Como comunicar .NET 10 com Pydantic usando Logfire</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:47:37 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/como-comunicar-net-10-com-pydantic-usando-logfire-g8g</link>
      <guid>https://dev.to/daniloopinheiro/como-comunicar-net-10-com-pydantic-usando-logfire-g8g</guid>
      <description>&lt;p&gt;Uma implementação simples de observabilidade com OpenTelemetry&lt;/p&gt;

&lt;p&gt;Quando pensamos no ecossistema &lt;strong&gt;Pydantic&lt;/strong&gt;, normalmente associamos a tecnologia ao Python, validação de dados e aplicações de Inteligência Artificial. Porém, existe uma possibilidade muito interessante para aplicações .NET: utilizar o &lt;strong&gt;Pydantic Logfire&lt;/strong&gt; como plataforma de observabilidade para uma aplicação construída em &lt;strong&gt;.NET 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E aqui está o ponto mais importante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Não precisamos criar uma integração específica entre .NET e Pydantic.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O caminho mais simples é utilizar o &lt;strong&gt;OpenTelemetry&lt;/strong&gt;, padrão aberto utilizado pelo Logfire. O .NET envia traces, métricas e logs através do protocolo &lt;strong&gt;OTLP&lt;/strong&gt;, e o Logfire recebe e apresenta essas informações em sua plataforma. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos construir uma implementação simples utilizando &lt;strong&gt;.NET 10 + ASP.NET Core + OpenTelemetry + Logfire&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 O que vamos construir?
&lt;/h2&gt;

&lt;p&gt;A arquitetura será propositalmente simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐
│      Cliente         │
└──────────┬───────────┘
           │ HTTP
           ▼
┌──────────────────────┐
│      .NET 10 API     │
│                      │
│ ASP.NET Core         │
│ ILogger              │
│ Activity             │
│ Metrics              │
└──────────┬───────────┘
           │
           │ OTLP / HTTP
           ▼
┌──────────────────────┐
│   Pydantic Logfire   │
│                      │
│ Logs                 │
│ Traces               │
│ Metrics              │
└──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O objetivo não é transformar o .NET em uma aplicação Python/Pydantic.&lt;/p&gt;

&lt;p&gt;O objetivo é &lt;strong&gt;comunicar uma aplicação .NET com o ecossistema Pydantic através de um padrão de observabilidade aberto&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 1. Onde entra o Pydantic?
&lt;/h1&gt;

&lt;p&gt;O ecossistema Pydantic possui diferentes ferramentas.&lt;/p&gt;

&lt;p&gt;Na imagem apresentada, podemos observar uma organização bastante interessante:&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ Build
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pydantic AI&lt;/li&gt;
&lt;li&gt;Pydantic Validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔄 Iterate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pydantic Evals&lt;/li&gt;
&lt;li&gt;Logfire Agent Optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Deploy &amp;amp; Monitor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logfire Agent Monitoring&lt;/li&gt;
&lt;li&gt;Logfire Infrastructure Monitoring&lt;/li&gt;
&lt;li&gt;Logfire&lt;/li&gt;
&lt;li&gt;Logfire AI Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para uma primeira implementação com .NET, entretanto, &lt;strong&gt;não precisamos começar por Pydantic AI, Evals ou AI Gateway&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A opção mais simples é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;.NET 10 → OpenTelemetry → Logfire&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso reduz drasticamente a complexidade inicial.&lt;/p&gt;

&lt;p&gt;O próprio Logfire informa que aplicações em linguagens compatíveis com OpenTelemetry podem enviar telemetria diretamente para sua infraestrutura. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🔌 2. O que significa "comunicar .NET com Pydantic"?
&lt;/h1&gt;

&lt;p&gt;É importante fazer uma distinção.&lt;/p&gt;

&lt;p&gt;Não teremos necessariamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET
  ↓
Pydantic API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A arquitetura será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET
  ↓
OpenTelemetry
  ↓
OTLP
  ↓
Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;OTLP (OpenTelemetry Protocol)&lt;/strong&gt; é justamente o protocolo utilizado para transportar dados de telemetria entre aplicações e backends compatíveis. (&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/observability-with-otel?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Isso também significa que a mesma aplicação poderia posteriormente enviar sua telemetria para outras plataformas compatíveis com OpenTelemetry.&lt;/p&gt;




&lt;h1&gt;
  
  
  🛠️ 3. Criando a API .NET 10
&lt;/h1&gt;

&lt;p&gt;Vamos começar com uma aplicação mínima.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new webapi &lt;span class="nt"&gt;-n&lt;/span&gt; DotNetLogfire
&lt;span class="nb"&gt;cd &lt;/span&gt;DotNetLogfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confira o projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos nossa API .NET 10.&lt;/p&gt;




&lt;h1&gt;
  
  
  📦 4. Instalando OpenTelemetry
&lt;/h1&gt;

&lt;p&gt;Vamos instalar o exporter OTLP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos adicionar as instrumentações necessárias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
dotnet add package OpenTelemetry.Instrumentation.Http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O pacote &lt;code&gt;OpenTelemetry.Exporter.OpenTelemetryProtocol&lt;/code&gt; fornece o exporter OTLP para aplicações .NET e é compatível com &lt;code&gt;net10.0&lt;/code&gt;. (&lt;a href="https://www.nuget.org/packages/opentelemetry.exporter.opentelemetryprotocol/1.12.0?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;NuGet&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🔐 5. Criando um token no Logfire
&lt;/h1&gt;

&lt;p&gt;No Logfire, crie um projeto e gere um &lt;strong&gt;write token&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esse token será utilizado pela aplicação para autenticar o envio da telemetria.&lt;/p&gt;

&lt;p&gt;Não coloque o token diretamente no código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Não faça isso&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"meu-token-real"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefira variável de ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOGFIRE_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite manter credenciais fora do código-fonte.&lt;/p&gt;

&lt;p&gt;A documentação do Logfire utiliza o header de autorização para autenticar os dados enviados através de OTLP. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🌐 6. Configurando o endpoint do Logfire
&lt;/h1&gt;

&lt;p&gt;Para uma configuração simples, podemos utilizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT=https://logfire-us.pydantic.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_HEADERS=Authorization=SEU_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Logfire documenta explicitamente essa configuração para clientes OpenTelemetry que não possuem um SDK específico do Logfire. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se seu projeto estiver utilizando a região europeia, utilize o endpoint correspondente do Logfire EU.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  ⚙️ 7. Configurando o OpenTelemetry no .NET
&lt;/h1&gt;

&lt;p&gt;Agora vamos configurar o &lt;code&gt;Program.cs&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OpenTelemetry.Logs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OpenTelemetry.Metrics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OpenTelemetry.Trace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IncludeFormattedMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IncludeScopes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithTracing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tracing&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tracing&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAspNetCoreInstrumentation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHttpClientInstrumentation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithMetrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAspNetCoreInstrumentation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRuntimeInstrumentation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseOtlpExporter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello Logfire!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A estrutura segue o modelo recomendado pelo OpenTelemetry no .NET: &lt;code&gt;ILogger&lt;/code&gt; para logs, &lt;code&gt;ActivitySource&lt;/code&gt; para tracing e &lt;code&gt;Meter&lt;/code&gt; para métricas. (&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/observability-with-otel?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  📊 8. O que estamos enviando?
&lt;/h1&gt;

&lt;p&gt;Agora temos três categorias principais.&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Logs
&lt;/h2&gt;

&lt;p&gt;Gerados através de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ILogger&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Consultando produtos"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Keyboard"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔎 9. Traces
&lt;/h1&gt;

&lt;p&gt;O OpenTelemetry consegue instrumentar automaticamente requisições HTTP do ASP.NET Core.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /products
      │
      ▼
ASP.NET Core
      │
      ▼
Controller / Endpoint
      │
      ▼
HttpClient
      │
      ▼
External API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse fluxo pode ser representado como um trace.&lt;/p&gt;

&lt;p&gt;A grande vantagem é conseguir entender &lt;strong&gt;onde uma requisição gastou tempo&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  📈 10. Métricas
&lt;/h1&gt;

&lt;p&gt;Também podemos trabalhar com métricas.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Requests
Request Duration
Active Requests
Runtime Metrics
GC
CPU
Memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ASP.NET Core e o .NET já possuem diversas métricas instrumentadas, e o OpenTelemetry pode coletá-las. (&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-10.0&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🧪 11. Criando um endpoint para teste
&lt;/h1&gt;

&lt;p&gt;Vamos criar um endpoint um pouco mais interessante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/orders/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Consultando pedido {OrderId}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogWarning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"Pedido inválido: {OrderId}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BadRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Processed"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos testar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /orders/10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /orders/0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teremos dois comportamentos diferentes.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 12. Gerando um erro proposital
&lt;/h1&gt;

&lt;p&gt;Para entender melhor a observabilidade, podemos criar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Erro de demonstração"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando acessarmos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;teremos uma exceção.&lt;/p&gt;

&lt;p&gt;O objetivo aqui é observar como o problema aparece no Logfire.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔗 13. O fluxo completo
&lt;/h1&gt;

&lt;p&gt;Agora nossa arquitetura está assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌───────────────────┐
                    │     Browser       │
                    │    Postman        │
                    │      Client       │
                    └─────────┬─────────┘
                              │
                              ▼
                    ┌───────────────────┐
                    │     .NET 10       │
                    │    ASP.NET Core   │
                    └─────────┬─────────┘
                              │
             ┌────────────────┼────────────────┐
             │                │                │
             ▼                ▼                ▼
          ILogger          Activity           Meter
             │                │                │
             └────────────────┼────────────────┘
                              ▼
                      ┌───────────────┐
                      │ OpenTelemetry │
                      └───────┬───────┘
                              │
                             OTLP
                              │
                              ▼
                     ┌─────────────────┐
                     │    Logfire      │
                     │   Pydantic      │
                     └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é a parte mais interessante da implementação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não criamos um SDK proprietário para integrar o .NET.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Utilizamos um padrão aberto.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧩 14. Por que essa abordagem é interessante?
&lt;/h1&gt;

&lt;p&gt;Imagine que amanhã você queira trocar o Logfire.&lt;/p&gt;

&lt;p&gt;A aplicação não precisa ser completamente reescrita.&lt;/p&gt;

&lt;p&gt;Poderíamos direcionar o OpenTelemetry para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET
 │
 └── OpenTelemetry
       │
       ├── Logfire
       ├── Grafana
       ├── Datadog
       ├── Azure Monitor
       ├── New Relic
       └── Outro backend OTLP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa independência é justamente uma das principais vantagens do OpenTelemetry. (&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/observability-with-otel?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🏗️ 15. E onde entra o Pydantic AI?
&lt;/h1&gt;

&lt;p&gt;Aqui começa uma arquitetura ainda mais interessante.&lt;/p&gt;

&lt;p&gt;Podemos ter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             ┌─────────────────┐
             │     .NET 10     │
             │       API       │
             └────────┬────────┘
                      │
                      │ HTTP
                      ▼
             ┌─────────────────┐
             │  Pydantic AI   │
             │     Agent      │
             └────────┬────────┘
                      │
                      ▼
                   LLM
                      │
                      ▼
                 Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse cenário, o .NET poderia ser responsável por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;autenticação&lt;/li&gt;
&lt;li&gt;regras de negócio&lt;/li&gt;
&lt;li&gt;banco de dados&lt;/li&gt;
&lt;li&gt;integrações corporativas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enquanto o ecossistema Pydantic poderia assumir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agentes&lt;/li&gt;
&lt;li&gt;validação&lt;/li&gt;
&lt;li&gt;avaliação&lt;/li&gt;
&lt;li&gt;workflows de IA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E o Logfire poderia fornecer uma camada de observabilidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  🤖 16. Uma arquitetura híbrida .NET + Pydantic
&lt;/h1&gt;

&lt;p&gt;Uma arquitetura mais completa poderia ficar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Client
                     │
                     ▼
              ┌──────────────┐
              │   .NET 10    │
              │     API      │
              └──────┬───────┘
                     │
          ┌──────────┴──────────┐
          │                     │
          ▼                     ▼
     Business Rules         Pydantic AI
          │                     │
          │                     ▼
          │                    LLM
          │                     │
          └──────────┬──────────┘
                     ▼
                OpenTelemetry
                     │
                     ▼
                  Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria uma separação interessante entre &lt;strong&gt;aplicação empresarial&lt;/strong&gt; e &lt;strong&gt;camada de inteligência artificial&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔐 17. Segurança
&lt;/h1&gt;

&lt;p&gt;Um ponto extremamente importante é evitar enviar informações sensíveis para uma plataforma de observabilidade.&lt;/p&gt;

&lt;p&gt;Por exemplo, evite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"Cartão: {CardNumber}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"Token: {Token}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"Pagamento processado para o pedido {OrderId}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Logfire também possui mecanismos de processamento e redaction através do ecossistema OpenTelemetry Collector para cenários em que dados precisam ser filtrados antes do envio. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/otel-collector/otel-collector-scrubbing/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🐳 18. E se eu quiser usar Docker?
&lt;/h1&gt;

&lt;p&gt;A aplicação pode continuar sendo executada normalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; dotnet-logfire &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://logfire-us.pydantic.dev &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_PROTOCOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http/protobuf &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_HEADERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Authorization=SEU_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
dotnet-logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, as configurações permanecem fora da imagem.&lt;/p&gt;




&lt;h1&gt;
  
  
  📦 19. E o OpenTelemetry Collector?
&lt;/h1&gt;

&lt;p&gt;Em uma arquitetura maior, podemos adicionar um Collector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET 10
   │
   ▼
OpenTelemetry
   │
   ▼
OTel Collector
   │
   ├──────────────► Logfire
   │
   ├──────────────► Grafana
   │
   └──────────────► Datadog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é particularmente interessante quando existe necessidade de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;filtragem;&lt;/li&gt;
&lt;li&gt;redaction;&lt;/li&gt;
&lt;li&gt;transformação;&lt;/li&gt;
&lt;li&gt;roteamento;&lt;/li&gt;
&lt;li&gt;múltiplos backends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O próprio Logfire documenta o uso do OpenTelemetry Collector como camada intermediária para processamento e encaminhamento da telemetria. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/otel-collector/otel-collector-overview/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 20. O que aprendemos?
&lt;/h1&gt;

&lt;p&gt;A implementação demonstrou algo importante:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrar .NET com Pydantic não significa necessariamente consumir uma API Python diretamente.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Podemos utilizar o ecossistema de padrões que conecta as duas tecnologias.&lt;/p&gt;

&lt;p&gt;A arquitetura utilizada foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET 10
   ↓
OpenTelemetry
   ↓
OTLP
   ↓
Pydantic Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E isso nos permite observar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logs
Traces
Metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em uma plataforma construída para observabilidade de aplicações e sistemas de IA. O Logfire atualmente se posiciona justamente como uma plataforma de observabilidade baseada em OpenTelemetry para aplicações, serviços e agentes de IA. (&lt;a href="https://pydantic.dev/docs/logfire/get-started/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Pydantic&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 21. Próximo passo: .NET + Pydantic AI
&lt;/h1&gt;

&lt;p&gt;Depois dessa primeira comunicação, podemos evoluir a arquitetura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nível 1 — Observabilidade
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET 10
   ↓
OpenTelemetry
   ↓
Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nível 2 — API + Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.NET 10
   ↓
Pydantic AI
   ↓
LLM
   ↓
Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nível 3 — Arquitetura completa
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Client
                   │
                   ▼
                .NET 10
                   │
          ┌────────┴────────┐
          ▼                 ▼
      Database        Pydantic AI
                            │
                            ▼
                           LLM
                            │
                            ▼
                       OpenTelemetry
                            │
                            ▼
                         Logfire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa evolução abre espaço para aplicações híbridas envolvendo &lt;strong&gt;.NET, agentes de IA, LLMs, observabilidade e arquitetura distribuída&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ Conclusão
&lt;/h1&gt;

&lt;p&gt;O mais interessante nessa integração é justamente sua simplicidade.&lt;/p&gt;

&lt;p&gt;Para começar, não precisamos criar uma ponte complexa entre .NET e Python.&lt;/p&gt;

&lt;p&gt;Podemos utilizar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET 10 + OpenTelemetry + OTLP + Logfire.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com poucas configurações, uma aplicação .NET consegue enviar &lt;strong&gt;logs, traces e métricas&lt;/strong&gt; para o Logfire, aproveitando um padrão aberto e independente de fornecedor. (&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;logfire.pydantic.dev&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;E essa abordagem pode ser o primeiro passo para uma arquitetura muito maior, conectando &lt;strong&gt;APIs .NET, Pydantic AI, agentes, LLMs e observabilidade&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Talvez a melhor forma de começar com Pydantic no .NET não seja começar pelo Pydantic — mas pelo OpenTelemetry.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h1&gt;

&lt;p&gt;Se você trabalha com &lt;strong&gt;.NET moderno&lt;/strong&gt; e quer evoluir em temas como &lt;strong&gt;arquitetura, C#, Inteligência Artificial, observabilidade, DevOps ou interoperabilidade&lt;/strong&gt;, vamos conversar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 shifters.dev&lt;/li&gt;
&lt;li&gt;💼 LinkedIn&lt;/li&gt;
&lt;li&gt;💻 Dev.to&lt;/li&gt;
&lt;li&gt;✍️ Medium&lt;/li&gt;
&lt;li&gt;✍️ Substack&lt;/li&gt;
&lt;li&gt;📬 &lt;a href="mailto:contato@dopme.io"&gt;contato@dopme.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔗 Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pydantic.dev/logfire?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Pydantic Logfire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://logfire.pydantic.dev/docs/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Documentação do Logfire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://logfire.pydantic.dev/docs/how-to-guides/alternative-clients/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Logfire — integração com clientes OpenTelemetry alternativos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/observability-with-otel?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;OpenTelemetry no .NET — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/observability-otlp-example?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Exemplo de OTLP no .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Eu lhes dou este novo mandamento: amem uns aos outros. Assim como eu os amei, amem também uns aos outros.&lt;br&gt;
João 13:34&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>python</category>
      <category>devops</category>
    </item>
    <item>
      <title>🚀 JWT sem hash forte de senha é armadilha — Argon2 + .NET fecham o ciclo</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Mon, 01 Jun 2026 00:51:21 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/jwt-sem-hash-forte-de-senha-e-armadilha-argon2-net-fecham-o-ciclo-3be6</link>
      <guid>https://dev.to/daniloopinheiro/jwt-sem-hash-forte-de-senha-e-armadilha-argon2-net-fecham-o-ciclo-3be6</guid>
      <description>&lt;p&gt;A stack de autenticação em &lt;strong&gt;&lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;&lt;/strong&gt; fica sólida quando separamos duas responsabilidades:&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Argon2id&lt;/strong&gt; para guardar senhas (hash irreversível, lento, memória-intensivo)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;JWT Bearer&lt;/strong&gt; para provar identidade &lt;strong&gt;depois&lt;/strong&gt; do login&lt;br&gt;&lt;br&gt;
✅ Validação de &lt;strong&gt;&lt;code&gt;iss&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;aud&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;exp&lt;/code&gt;&lt;/strong&gt; e assinatura em cada request&lt;br&gt;&lt;br&gt;
✅ Segredos &lt;strong&gt;fora do repositório&lt;/strong&gt; (ambiente / Key Vault)&lt;/p&gt;

&lt;p&gt;Se o ecossistema &lt;strong&gt;&lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;&lt;/strong&gt; já oferece hosting, APIs e pacotes maduros, combinar &lt;strong&gt;Argon2&lt;/strong&gt; (referência da &lt;a href="https://password-hashing.net/" rel="noopener noreferrer"&gt;Password Hashing Competition&lt;/a&gt;, testável em &lt;a href="https://argon2.online/" rel="noopener noreferrer"&gt;argon2.online&lt;/a&gt;) com &lt;strong&gt;JWT&lt;/strong&gt; é o caminho natural para microsserviços e Web APIs.&lt;/p&gt;

&lt;p&gt;Neste artigo, mostro o &lt;strong&gt;fluxo registo → login → token → rotas protegidas&lt;/strong&gt; com foco no que implementar no dia a dia.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Observação importante&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;JWT não substitui Argon2.&lt;/strong&gt; Nunca coloque senha ou hash no payload do token. Argon2 protege a credencial na base de dados; JWT é sessão assinada com expiração.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧠 Visão Geral
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Argon2 (senha)&lt;/th&gt;
&lt;th&gt;JWT (sessão)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Foco&lt;/td&gt;
&lt;td&gt;Resistir a offline cracking&lt;/td&gt;
&lt;td&gt;Autorizar requests após login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onde vive&lt;/td&gt;
&lt;td&gt;Coluna &lt;code&gt;password_hash&lt;/code&gt; na BD&lt;/td&gt;
&lt;td&gt;Header &lt;code&gt;Authorization: Bearer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Algoritmo&lt;/td&gt;
&lt;td&gt;Argon2id (OWASP)&lt;/td&gt;
&lt;td&gt;HMAC-SHA256 ou RSA (config)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ferramenta de estudo&lt;/td&gt;
&lt;td&gt;&lt;a href="https://argon2.online/" rel="noopener noreferrer"&gt;argon2.online&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;docs Microsoft JWT Bearer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Biblioteca .NET (ex.: Konscious Argon2)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Microsoft.AspNetCore.Authentication.JwtBearer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erro clássico&lt;/td&gt;
&lt;td&gt;MD5/SHA rápido na senha&lt;/td&gt;
&lt;td&gt;Token sem validar &lt;code&gt;aud&lt;/code&gt;/&lt;code&gt;iss&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧩 O que o Argon2 resolve (camada 1)
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Argon2&lt;/strong&gt; é o vencedor da Password Hashing Competition — hoje a referência para &lt;strong&gt;novas passwords&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1️⃣ Hash irreversível com Argon2id
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hasher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Salt único por utilizador&lt;br&gt;&lt;br&gt;
✅ Parâmetros &lt;code&gt;m&lt;/code&gt;, &lt;code&gt;t&lt;/code&gt;, &lt;code&gt;p&lt;/code&gt; documentados no próprio hash&lt;br&gt;&lt;br&gt;
✅ Verificação com tempo constante (&lt;code&gt;FixedTimeEquals&lt;/code&gt;)&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ Calibrar custo com consciência
&lt;/h3&gt;

&lt;p&gt;Em &lt;a href="https://argon2.online/" rel="noopener noreferrer"&gt;argon2.online&lt;/a&gt; podes &lt;strong&gt;experimentar&lt;/strong&gt; memory cost e iterations — útil em laboratório.&lt;/p&gt;

&lt;p&gt;📌 Em produção usa biblioteca auditada (.NET), não hashes de utilizadores reais em sites públicos.&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ O que não fazer na senha
&lt;/h3&gt;

&lt;p&gt;✅ Não “criptografar” senha com AES reversível&lt;br&gt;&lt;br&gt;
✅ Não MD5 / SHA-1 / SHA-256 simples&lt;br&gt;&lt;br&gt;
✅ Não logar password nem hash em erros&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 O que o JWT resolve no .NET (camada 2)
&lt;/h2&gt;

&lt;p&gt;Depois de &lt;code&gt;Verify&lt;/code&gt; com sucesso, o &lt;strong&gt;&lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;&lt;/strong&gt; emite um token assinado.&lt;/p&gt;


&lt;h3&gt;
  
  
  1️⃣ Emissão após login
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sem JWT (só sessão server-side):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cookie de sessão + estado no servidor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Com JWT Bearer (API stateless):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Roles&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bearer"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Claims mínimos: &lt;code&gt;sub&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt; — sem senha no token.&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ Validação no pipeline ASP.NET Core
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ValidateIssuer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ValidateAudience&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ValidateLifetime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ValidateIssuerSigningKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Rejeita token expirado&lt;br&gt;&lt;br&gt;
✅ Rejeita &lt;code&gt;iss&lt;/code&gt;/&lt;code&gt;aud&lt;/code&gt; incorretos&lt;br&gt;&lt;br&gt;
✅ Protege rotas com &lt;code&gt;.RequireAuthorization()&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ Segredo de assinatura
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jwt:SigningKey → variável de ambiente / Key Vault (NUNCA no Git)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 Rotação de chave planeada em produção.&lt;/p&gt;


&lt;h3&gt;
  
  
  4️⃣ Pacotes no ecossistema .NET
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Microsoft.AspNetCore.Authentication.JwtBearer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;System.IdentityModel.Tokens.Jwt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Konscious.Security.Cryptography.Argon2&lt;/code&gt; (ou equivalente Argon2id)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ Alinhado ao stack oficial em &lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;dotnet.microsoft.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
➡️ APIs, cloud e tooling no mesmo SDK&lt;/p&gt;


&lt;h3&gt;
  
  
  5️⃣ Hardening obrigatório
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Rate limit em &lt;code&gt;/auth/login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  HTTPS em produção&lt;/li&gt;
&lt;li&gt;  Mensagem genérica em falha de login (não revelar se email existe)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Ideal para APIs expostas na internet e microsserviços.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗️ Impacto Arquitetural
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔹 APIs ASP.NET Core
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Login local com Argon2 + JWT para o resto da API&lt;/li&gt;
&lt;li&gt;  Gateway (YARP) pode reencaminhar o Bearer token&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔹 SPAs e Blazor WASM
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Login via API — hash de senha no servidor, não só no browser&lt;/li&gt;
&lt;li&gt;  Preferir cookie &lt;code&gt;HttpOnly&lt;/code&gt; ou memória volátil ao &lt;code&gt;localStorage&lt;/code&gt; se XSS for risco&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔹 Equipas de segurança
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  ADR: Argon2id + validação JWT completa&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://argon2.online/" rel="noopener noreferrer"&gt;argon2.online&lt;/a&gt; apenas para testes de parâmetros&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Comparação prática
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Errado&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Claim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// NUNCA no JWT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Certo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BD: Argon2&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hasher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Login OK → JWT&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Quando adotar JWT + Argon2?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Adote se:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Expõe REST/Minimal API em .NET&lt;/li&gt;
&lt;li&gt;  Precisa de auth stateless entre serviços&lt;/li&gt;
&lt;li&gt;  Controla login local (email/senha)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Avalie com cautela se:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Só login corporativo → OpenID Connect / Entra ID&lt;/li&gt;
&lt;li&gt;  Monólito com sessão simples → cookies + Identity pode bastar&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 Direção da autenticação .NET
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Menos hashes fracos em legado&lt;/li&gt;
&lt;li&gt;  Mais Argon2id + políticas OWASP&lt;/li&gt;
&lt;li&gt;  JWT com validação estrita e refresh tokens rotativos&lt;/li&gt;
&lt;li&gt;  MFA além de senha forte&lt;/li&gt;
&lt;li&gt;  Integração cloud nativa no &lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JWT com Argon2 no .NET&lt;/strong&gt; não é moda: é &lt;strong&gt;separação correta&lt;/strong&gt; — &lt;a href="https://argon2.online/" rel="noopener noreferrer"&gt;argon2.online&lt;/a&gt; e a documentação Argon2 ajudam a entender o hash; &lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;dotnet.microsoft.com&lt;/a&gt; é a base para APIs e pacotes JWT.&lt;/p&gt;

&lt;p&gt;O resultado é login defensável e APIs autorizadas sem confundir «token» com «senha guardada».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Artigo completo:&lt;/strong&gt; &lt;a href="https://dopme.io/centro-conhecimento/artigos/seguranca/jwt-argon2-dotnet" rel="noopener noreferrer"&gt;https://dopme.io/centro-conhecimento/artigos/seguranca/jwt-argon2-dotnet&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com &lt;strong&gt;.NET moderno&lt;/strong&gt; e quer evoluir em temas como &lt;strong&gt;arquitetura, C#, DevOps, segurança e interoperabilidade&lt;/strong&gt;, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;Devto&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Não vos escrevi porque não soubésseis a verdade, mas porque a sabeis, e porque nenhuma mentira é da verdade. 1 João 2:21&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>dotnet</category>
      <category>argon</category>
      <category>api</category>
      <category>jwt</category>
    </item>
    <item>
      <title>🚀 C# 14 já estava bom… agora ficou ainda melhor</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Mon, 23 Mar 2026 01:31:39 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/c-14-ja-estava-bom-agora-ficou-ainda-melhor-5ell</link>
      <guid>https://dev.to/daniloopinheiro/c-14-ja-estava-bom-agora-ficou-ainda-melhor-5ell</guid>
      <description>&lt;h1&gt;
  
  
  🚀 C# 14 já estava bom… agora ficou ainda melhor
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Comparando C# 14 vs C# 15 e o que muda na prática para desenvolvedores .NET
&lt;/h2&gt;

&lt;p&gt;A evolução do &lt;strong&gt;C#&lt;/strong&gt; segue um padrão cada vez mais claro:&lt;br&gt;&lt;br&gt;
✅ reduzir complexidade&lt;br&gt;&lt;br&gt;
✅ aumentar expressividade&lt;br&gt;&lt;br&gt;
✅ melhorar performance&lt;br&gt;&lt;br&gt;
✅ elevar a produtividade do desenvolvedor&lt;/p&gt;

&lt;p&gt;Se o &lt;strong&gt;C# 14&lt;/strong&gt; já consolidou uma linguagem mais limpa, moderna e consistente, o &lt;strong&gt;C# 15&lt;/strong&gt; (ainda em evolução) dá mais um passo importante rumo a um ecossistema mais fluido, seguro e alinhado às demandas do desenvolvimento moderno em &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, exploramos as &lt;strong&gt;principais diferenças entre C# 14 e C# 15&lt;/strong&gt;, com foco no &lt;strong&gt;impacto real no dia a dia de quem desenvolve aplicações .NET&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Observação importante&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O &lt;strong&gt;C# 15 encontra-se em fase de preview/evolução&lt;/strong&gt;. Os exemplos apresentados refletem &lt;strong&gt;direções e conceitos esperados&lt;/strong&gt;, podendo sofrer ajustes até a versão final.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧠 Visão Geral
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;C# 14&lt;/th&gt;
&lt;th&gt;C# 15&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Foco&lt;/td&gt;
&lt;td&gt;Simplificação e consistência&lt;/td&gt;
&lt;td&gt;Produtividade e redução de boilerplate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sintaxe&lt;/td&gt;
&lt;td&gt;Mais limpa&lt;/td&gt;
&lt;td&gt;Ainda mais concisa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pattern Matching&lt;/td&gt;
&lt;td&gt;Avançado&lt;/td&gt;
&lt;td&gt;Mais poderoso e flexível&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coleções&lt;/td&gt;
&lt;td&gt;Simplificadas&lt;/td&gt;
&lt;td&gt;Expandidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interoperabilidade&lt;/td&gt;
&lt;td&gt;Melhorias incrementais&lt;/td&gt;
&lt;td&gt;Mais abstração e segurança&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experiência do Dev&lt;/td&gt;
&lt;td&gt;Boa&lt;/td&gt;
&lt;td&gt;Ainda melhor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🧩 O que o C# 14 trouxe
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;C# 14&lt;/strong&gt; consolidou melhorias importantes que vinham sendo introduzidas ao longo das versões anteriores.&lt;/p&gt;
&lt;h3&gt;
  
  
  1️⃣ Inicialização simplificada de coleções
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Menos código&lt;br&gt;&lt;br&gt;
✅ Mais legibilidade&lt;br&gt;&lt;br&gt;
✅ Sintaxe mais direta&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ Pattern Matching mais expressivo
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Usuário válido"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Código mais declarativo&lt;br&gt;&lt;br&gt;
✅ Redução de &lt;code&gt;if/else&lt;/code&gt; encadeados&lt;br&gt;&lt;br&gt;
✅ Melhor leitura da intenção&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ Melhor suporte a cenários de performance
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;stackalloc&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Menos alocações no heap&lt;br&gt;&lt;br&gt;
✅ Melhor uso de memória&lt;br&gt;&lt;br&gt;
✅ Ideal para sistemas de alta performance&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 O que o C# 15 melhora
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;C# 15 não é uma revolução&lt;/strong&gt;, mas sim uma &lt;strong&gt;evolução refinada&lt;/strong&gt; do que já vinha sendo construído.&lt;/p&gt;


&lt;h3&gt;
  
  
  1️⃣ Ainda menos boilerplate
&lt;/h3&gt;

&lt;p&gt;A proposta é reduzir ainda mais código repetitivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C# 14:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Danilo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C# 15 (conceito esperado):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Danilo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Inicialização mais direta, fluida e expressiva.&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ Pattern Matching ainda mais poderoso
&lt;/h3&gt;

&lt;p&gt;Expansão dos padrões compostos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Paid"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pedido válido"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Menos código imperativo&lt;br&gt;&lt;br&gt;
✅ Mais clareza semântica&lt;br&gt;&lt;br&gt;
✅ Melhor leitura da regra de negócio&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ Evolução no suporte a coleções
&lt;/h3&gt;

&lt;p&gt;Ampliação das &lt;em&gt;collection expressions&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="n"&gt;otherValues&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Composição de dados mais simples e natural.&lt;/p&gt;




&lt;h3&gt;
  
  
  4️⃣ Funções e expressões mais diretas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Mais coerência com estilos funcionais&lt;br&gt;&lt;br&gt;
➡️ Código mais enxuto e previsível&lt;/p&gt;


&lt;h3&gt;
  
  
  5️⃣ Interoperabilidade ainda mais forte
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;C# 15&lt;/strong&gt; continua evoluindo cenários críticos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Interop com código nativo&lt;/li&gt;
&lt;li&gt;  APIs de alto desempenho&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Ideal para sistemas críticos, de alta escala e baixa latência.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗️ Impacto Arquitetural
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔹 Aplicações corporativas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Código mais limpo&lt;/li&gt;
&lt;li&gt;  Menos repetição&lt;/li&gt;
&lt;li&gt;  Melhor manutenção e evolução&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔹 Sistemas distribuídos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Modelagem de dados mais clara&lt;/li&gt;
&lt;li&gt;  Menor acoplamento&lt;/li&gt;
&lt;li&gt;  APIs mais expressivas&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔹 Times de desenvolvimento
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Padronização mais simples&lt;/li&gt;
&lt;li&gt;  Onboarding mais rápido&lt;/li&gt;
&lt;li&gt;  Revisões de código mais eficientes&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Comparação prática
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C# 14&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C# 15&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;C# 14&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C# 15&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IsActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Quando atualizar?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Atualize para C# 15 se:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Já utiliza versões recentes do .NET&lt;/li&gt;
&lt;li&gt;  Busca reduzir boilerplate&lt;/li&gt;
&lt;li&gt;  Quer código mais expressivo&lt;/li&gt;
&lt;li&gt;  Está iniciando novos projetos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Avalie com cautela se:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  O projeto é legado e crítico&lt;/li&gt;
&lt;li&gt;  Ferramentas e bibliotecas ainda não suportam totalmente&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 Direção do C\
&lt;/h2&gt;

&lt;p&gt;O caminho do C# está cada vez mais claro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Menos código repetitivo&lt;/li&gt;
&lt;li&gt;  Mais expressividade&lt;/li&gt;
&lt;li&gt;  Mais segurança&lt;/li&gt;
&lt;li&gt;  Melhor performance&lt;/li&gt;
&lt;li&gt;  Integração cada vez maior com cloud e microserviços&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;Se o &lt;strong&gt;C# 14&lt;/strong&gt; já entregou uma experiência moderna e produtiva, o &lt;strong&gt;C# 15&lt;/strong&gt; dá continuidade a essa evolução com foco em &lt;strong&gt;simplicidade, fluidez e consistência&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Não se trata de mudanças radicais, mas de &lt;strong&gt;refinamentos que fazem grande diferença no dia a dia&lt;/strong&gt;, especialmente em projetos grandes e times distribuídos.&lt;/p&gt;

&lt;p&gt;O resultado é uma linguagem cada vez mais preparada para os desafios do desenvolvimento moderno.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com &lt;strong&gt;.NET moderno&lt;/strong&gt; e quer evoluir em temas como &lt;strong&gt;arquitetura, C#, DevOps e interoperabilidade&lt;/strong&gt;, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;Devto&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Não vos escrevi porque não soubésseis a verdade, mas porque a sabeis, e porque nenhuma mentira é da verdade. 1 João 2:21&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
    </item>
    <item>
      <title>Dez tecnologias essenciais em .NET</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Sat, 21 Mar 2026 20:35:53 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/dez-tecnologias-essenciais-em-net-3p4f</link>
      <guid>https://dev.to/daniloopinheiro/dez-tecnologias-essenciais-em-net-3p4f</guid>
      <description>&lt;p&gt;Este material está alinhado à conversa em vídeo &lt;strong&gt;“10 coisas que você deve fazer na sua aplicação .NET”&lt;/strong&gt;, publicada no YouTube pelo canal &lt;strong&gt;Eximiaco — Excelência Tecnológica&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gabriel Kohlrausch&lt;/strong&gt; conduz a conversa com &lt;strong&gt;Bruno Joaquim&lt;/strong&gt; (desenvolvimento .NET/Node.js e Kafka) e &lt;strong&gt;Francisco Schneider&lt;/strong&gt; (especialista em .NET em aplicações corporativas complexas). Página oficial da live e resumo do tema: &lt;strong&gt;&lt;a href="https://eximia.co/lives/10-coisas-que-voce-deve-fazer-na-sua-aplicacao-net/" rel="noopener noreferrer"&gt;EximiaCo — 10 coisas que você deve fazer na sua aplicação .NET&lt;/a&gt;&lt;/strong&gt;. Perfil do mediador na consultoria: &lt;strong&gt;&lt;a href="https://ontologia.eximia.co/consultores/gabriel-kohlrausch/" rel="noopener noreferrer"&gt;Gabriel Kohlrausch — EximiaCo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O repositório &lt;strong&gt;dopTenEssentialTechNet&lt;/strong&gt; não substitui a palestra: ele oferece &lt;strong&gt;laboratórios em console&lt;/strong&gt; para experimentar, no código, temas que dialogam com essa linha de boas práticas em aplicações .NET.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Dominar o ecossistema .NET moderno vai além da linguagem C#: envolve configuração, hospedagem, HTTP resiliente, dados, testes e observabilidade. O repositório &lt;strong&gt;&lt;a href="https://github.com/dop-s/dopTenEssentialTechNet" rel="noopener noreferrer"&gt;dopTenEssentialTechNet&lt;/a&gt;&lt;/strong&gt; reúne &lt;strong&gt;aplicativos de console independentes&lt;/strong&gt;, todos com &lt;strong&gt;.NET 10&lt;/strong&gt; (&lt;code&gt;net10.0&lt;/code&gt;), cada um focado em um tema recorrente em projetos reais — em sintonia com a conversa citada acima.&lt;/p&gt;

&lt;p&gt;Este texto descreve o propósito do repositório, o que cada projeto representa e como utilizá-lo como material de estudo ou referência.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo do repositório
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Centralizar &lt;strong&gt;exemplos mínimos executáveis&lt;/strong&gt; (console), fáceis de abrir e rodar.&lt;/li&gt;
&lt;li&gt;Separar &lt;strong&gt;um tema por pasta&lt;/strong&gt;, sem misturar dependências desnecessárias entre exemplos.&lt;/li&gt;
&lt;li&gt;Servir de base para &lt;strong&gt;artigos&lt;/strong&gt;, &lt;strong&gt;treinamentos&lt;/strong&gt; ou &lt;strong&gt;experimentos&lt;/strong&gt; isolados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A solução está em &lt;code&gt;dopTenEssentialTechNet.sln&lt;/code&gt; na raiz; cada subpasta é um projeto &lt;code&gt;.csproj&lt;/code&gt; próprio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projetos e temas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Projeto&lt;/th&gt;
&lt;th&gt;O que se pretende explorar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SubStringSpan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manipulação eficiente de texto com &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;ReadOnlySpan&amp;lt;char&amp;gt;&lt;/code&gt; e &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt;, reduzindo alocações.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OptionsConfig&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Padrão Options (&lt;code&gt;IOptions&lt;/code&gt;, &lt;code&gt;IOptionsSnapshot&lt;/code&gt;) e ligação com &lt;code&gt;IConfiguration&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BackgroundServer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hospedagem com &lt;code&gt;Host&lt;/code&gt; / &lt;code&gt;IHostedService&lt;/code&gt; e execução contínua em segundo plano.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkflowCore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Definição e execução de fluxos com a biblioteca &lt;strong&gt;WorkflowCore&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VerticalSliceFastEndpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Estrutura em fatias verticais usando &lt;strong&gt;FastEndpoints&lt;/strong&gt; (API enxuta sobre ASP.NET Core).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTPolly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chamadas HTTP com &lt;strong&gt;Polly&lt;/strong&gt; (retentativas, circuit breaker, timeouts).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flurl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cliente HTTP declarativo com &lt;strong&gt;Flurl.Http&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TddContainers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Testes de integração com &lt;strong&gt;Testcontainers&lt;/strong&gt; (dependências reais em containers).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DynamicDapper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consultas e cenários dinâmicos com &lt;strong&gt;Dapper&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ContextPool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uso de &lt;strong&gt;pooling&lt;/strong&gt; de contexto (por exemplo, &lt;code&gt;DbContext&lt;/code&gt; com pool de conexões).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SourceGeneratedLogging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logging com &lt;strong&gt;source generators&lt;/strong&gt; (APIs geradas em tempo de compilação).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Os códigos evoluem com o tempo; a tabela acima define a &lt;strong&gt;intenção pedagógica&lt;/strong&gt; de cada pasta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;SDK .NET 10&lt;/a&gt; instalado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verificação rápida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como obter e compilar
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/daniloopinheiro/dopTenEssentialTechNet.git
&lt;span class="nb"&gt;cd &lt;/span&gt;dopTenEssentialTechNet
dotnet restore
dotnet build dopTenEssentialTechNet.sln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como executar um exemplo
&lt;/h2&gt;

&lt;p&gt;Substitua &lt;code&gt;NomeDoProjeto&lt;/code&gt; pelo nome da pasta (por exemplo, &lt;code&gt;SubStringSpan&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run &lt;span class="nt"&gt;--project&lt;/span&gt; NomeDoProjeto/NomeDoProjeto.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sugestão de ordem de estudo
&lt;/h2&gt;

&lt;p&gt;Não há ordem obrigatória. Uma sequência possível para quem está estruturando conhecimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SubStringSpan&lt;/strong&gt; e &lt;strong&gt;OptionsConfig&lt;/strong&gt; — fundamentos de performance e configuração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BackgroundServer&lt;/strong&gt; — modelo mental de serviços longos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPolly&lt;/strong&gt; e &lt;strong&gt;Flurl&lt;/strong&gt; — consumo de HTTP no mundo real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamicDapper&lt;/strong&gt; e &lt;strong&gt;ContextPool&lt;/strong&gt; — persistência e recursos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TddContainers&lt;/strong&gt; — confiança em integração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VerticalSliceFastEndpoints&lt;/strong&gt;, &lt;strong&gt;WorkflowCore&lt;/strong&gt; e &lt;strong&gt;SourceGeneratedLogging&lt;/strong&gt; — organização de API, orquestração e ferramentas modernas de logging.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  CI/CD e qualidade
&lt;/h2&gt;

&lt;p&gt;O repositório inclui pipelines em &lt;a href="//.github/workflows/"&gt;&lt;code&gt;.github/workflows/&lt;/code&gt;&lt;/a&gt; (build, dependências, monitoramento, deploy e versionamento). Detalhes operacionais estão no &lt;a href="//README.md"&gt;README principal&lt;/a&gt; e em &lt;a href="//.github/README_WORKFLOWS.md"&gt;&lt;code&gt;.github/README_WORKFLOWS.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;dopTenEssentialTechNet&lt;/strong&gt; é um mapa de estudo: cada console é um “capítulo” sobre um pedaço comum do .NET corporativo, em eco à discussão de &lt;strong&gt;Gabriel Kohlrausch&lt;/strong&gt; com &lt;strong&gt;Bruno Joaquim&lt;/strong&gt; e &lt;strong&gt;Francisco Schneider&lt;/strong&gt; sobre o que priorizar em aplicações .NET. Use o repositório para comparar abordagens, extrair trechos para seus próprios sistemas ou acompanhar evoluções de versão do SDK e das bibliotecas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conecte-se
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer evoluir em arquitetura, C#, DevOps, APIs e interoperabilidade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/daniloopinheiro"&gt;DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;daniloopinheiro@dopme.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando, pois, tiveres comido, e fores farto, louvarás ao Senhor teu Deus pela boa terra que te deu. Deuteronômio 8:10&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Construindo API Gateway Tyk utilizando .NET 10</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Mon, 09 Mar 2026 15:22:40 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/construindo-api-gateway-tyk-utilizando-net-10-4ami</link>
      <guid>https://dev.to/daniloopinheiro/construindo-api-gateway-tyk-utilizando-net-10-4ami</guid>
      <description>&lt;p&gt;Construindo API Gateway Tyk utilizando .NET 10&lt;/p&gt;

&lt;p&gt;No desenvolvimento de arquiteturas modernas baseadas em microserviços e APIs, o uso de um &lt;strong&gt;API Gateway&lt;/strong&gt; tornou-se praticamente essencial. Ele atua como uma camada intermediária entre clientes e serviços, centralizando segurança, autenticação, monitoramento, versionamento e controle de tráfego.&lt;/p&gt;

&lt;p&gt;Uma das soluções que vem ganhando destaque nesse cenário é o &lt;strong&gt;&lt;a href="https://tyk.io/" rel="noopener noreferrer"&gt;https://tyk.io/&lt;/a&gt;&lt;/strong&gt;, uma plataforma open source e cloud-ready para gerenciamento de APIs.&lt;/p&gt;

&lt;p&gt;Neste artigo vamos explorar como implementar um API Gateway utilizando &lt;strong&gt;Tyk&lt;/strong&gt; com uma API construída em &lt;strong&gt;.NET 10&lt;/strong&gt;, entendendo os conceitos arquiteturais, configuração do gateway e integração prática.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 O que é um API Gateway?
&lt;/h2&gt;

&lt;p&gt;Um API Gateway é um componente responsável por atuar como ponto único de entrada para múltiplos serviços.&lt;/p&gt;

&lt;p&gt;Ele pode oferecer funcionalidades como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  🔐 Autenticação e autorização&lt;/li&gt;
&lt;li&gt;  📊 Monitoramento e métricas&lt;/li&gt;
&lt;li&gt;  ⚡ Rate limiting&lt;/li&gt;
&lt;li&gt;  🔁 Balanceamento de carga&lt;/li&gt;
&lt;li&gt;  🔄 Versionamento de APIs&lt;/li&gt;
&lt;li&gt;  🧩 Transformação de requests/responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em vez de o cliente chamar diretamente vários serviços, ele interage com o gateway, que encaminha as requisições para os serviços corretos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Arquitetura da Solução
&lt;/h2&gt;

&lt;p&gt;Uma arquitetura simples com &lt;strong&gt;.NET 10 + Tyk&lt;/strong&gt; pode ser representada assim:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cliente
   │
   ▼
API Gateway (Tyk)
   │
   ├── API .NET 10 - Usuários
   ├── API .NET 10 - Produtos
   └── API .NET 10 - Pedidos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Benefícios da abordagem:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Centralização de segurança&lt;/li&gt;
&lt;li&gt;  Governança de APIs&lt;/li&gt;
&lt;li&gt;  Observabilidade unificada&lt;/li&gt;
&lt;li&gt;  Escalabilidade independente&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Criando a API com .NET 10
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos criar uma API simples utilizando o CLI do .NET.&lt;/p&gt;

&lt;p&gt;📌 Documentação oficial:&lt;br&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/dotnet/core/tools/" rel="noopener noreferrer"&gt;https://learn.microsoft.com/dotnet/core/tools/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new webapi &lt;span class="nt"&gt;-n&lt;/span&gt; ProductApi
&lt;span class="nb"&gt;cd &lt;/span&gt;ProductApi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute a aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Endpoint de exemplo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3500&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A API estará disponível em:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="http://localhost:5000/products" rel="noopener noreferrer"&gt;http://localhost:5000/products&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Instalando o Tyk API Gateway
&lt;/h2&gt;

&lt;p&gt;A maneira mais simples de executar o gateway é utilizando Docker.&lt;/p&gt;

&lt;p&gt;📌 Documentação oficial do Tyk Gateway:&lt;br&gt;&lt;br&gt;
&lt;a href="https://tyk.io/docs/tyk-gateway/" rel="noopener noreferrer"&gt;https://tyk.io/docs/tyk-gateway/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  tykio/tyk-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após subir o container, o gateway já estará pronto para configuração.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Criando uma Definição de API no Tyk
&lt;/h2&gt;

&lt;p&gt;O Tyk utiliza arquivos JSON para definir APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de configuração:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Product API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product-api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"org_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"use_keyless"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proxy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"listen_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/products/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://host.docker.internal:5000/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strip_listen_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explicando os principais campos:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nome da API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;api_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identificador único&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;use_keyless&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Permite acesso sem chave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listen_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Endpoint exposto no gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL da API real&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 Fluxo da Requisição
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cliente
   │
   ▼
http://localhost:8080/products
   │
   ▼
Tyk API Gateway
   │
   ▼
API .NET 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ou seja: &lt;strong&gt;o cliente não acessa diretamente a API&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Adicionando Segurança com API Key
&lt;/h2&gt;

&lt;p&gt;Para proteger sua API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"use_keyless"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora cada requisição deve enviar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Isso permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Controle de acesso&lt;/li&gt;
&lt;li&gt;  Limite de requisições&lt;/li&gt;
&lt;li&gt;  Monitoramento por cliente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Documentação:&lt;br&gt;&lt;br&gt;
&lt;a href="https://tyk.io/docs/nightly/api-management/authentication/basic-authentication#configuring-your-api-to-use-basic-authentication" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 Observabilidade e Monitoramento
&lt;/h2&gt;

&lt;p&gt;O Tyk oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Logs centralizados&lt;/li&gt;
&lt;li&gt;  Métricas de consumo&lt;/li&gt;
&lt;li&gt;  Rate limiting&lt;/li&gt;
&lt;li&gt;  Analytics de API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses dados são essenciais em ambientes com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  múltiplos microserviços&lt;/li&gt;
&lt;li&gt;  alto volume de requisições&lt;/li&gt;
&lt;li&gt;  integrações com terceiros&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧪 Testando a Integração
&lt;/h2&gt;

&lt;p&gt;Após configurar o gateway, basta chamar:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:8080/products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Resposta esperada:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Notebook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo resultado da API original — porém agora &lt;strong&gt;gerenciado pelo gateway&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Benefícios de Usar Tyk com .NET
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  🔹 Escalabilidade&lt;/li&gt;
&lt;li&gt;  🔹 Segurança centralizada&lt;/li&gt;
&lt;li&gt;  🔹 Observabilidade robusta&lt;/li&gt;
&lt;li&gt;  🔹 Governança e versionamento de APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Quando Utilizar um API Gateway
&lt;/h2&gt;

&lt;p&gt;Use um gateway quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  há múltiplos microserviços&lt;/li&gt;
&lt;li&gt;  há integração com sistemas externos&lt;/li&gt;
&lt;li&gt;  é necessário controle de segurança centralizado&lt;/li&gt;
&lt;li&gt;  existe alto volume de chamadas de API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em aplicações pequenas, pode ser exagero.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 O Futuro das APIs no .NET
&lt;/h2&gt;

&lt;p&gt;Com a evolução do .NET e da arquitetura baseada em APIs, ferramentas como API Gateways tendem a se tornar cada vez mais comuns.&lt;/p&gt;

&lt;p&gt;Plataformas modernas buscam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Padronização de integração&lt;/li&gt;
&lt;li&gt;  Segurança centralizada&lt;/li&gt;
&lt;li&gt;  Observabilidade completa&lt;/li&gt;
&lt;li&gt;  Redução da complexidade do cliente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Tyk é uma das opções mais poderosas nesse ecossistema.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;A integração entre &lt;strong&gt;.NET 10 e o Tyk API Gateway&lt;/strong&gt; demonstra como arquiteturas modernas podem ser construídas de forma escalável e organizada.&lt;/p&gt;

&lt;p&gt;Centralizando segurança, monitoramento e controle de tráfego, o gateway simplifica o desenvolvimento e melhora a governança em ambientes de APIs.&lt;/p&gt;

&lt;p&gt;Para equipes que trabalham com microserviços ou integrações complexas, essa abordagem oferece ganhos expressivos de produtividade e confiabilidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer evoluir em temas como arquitetura, C#, DevOps, APIs e interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;DEV Community&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;br&gt;
📧 &lt;a href="//daniloopinheiro@dopme.io"&gt;Email&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;O norte e o sul tu os criaste; Tabor e Hermom jubilam em teu nome.Tu tens um braço poderoso; forte é a tua mão, e alta está a tua destra.&lt;br&gt;
Salmos 89:12,13&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>microservices</category>
      <category>apigateway</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>🚀 Que bom que chegou C# 13, Porém o mais novo também C# 14</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:51:28 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/que-bom-que-chegou-c-13-porem-o-mais-novo-tambem-c-14-1409</link>
      <guid>https://dev.to/daniloopinheiro/que-bom-que-chegou-c-13-porem-o-mais-novo-tambem-c-14-1409</guid>
      <description>&lt;h2&gt;
  
  
  O que mudou e como isso impacta seu código no .NET moderno
&lt;/h2&gt;

&lt;p&gt;O C# continua evoluindo de forma incremental, priorizando &lt;strong&gt;clareza, segurança, performance e expressividade&lt;/strong&gt;.&lt;br&gt;
Com a chegada do C# 13 e a evolução para o C# 14, vemos melhorias voltadas principalmente para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melhor controle de memória&lt;/li&gt;
&lt;li&gt;Redução de boilerplate&lt;/li&gt;
&lt;li&gt;Padrões mais expressivos&lt;/li&gt;
&lt;li&gt;Maior previsibilidade em código de alto desempenho&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste artigo, vamos comparar as principais diferenças entre &lt;strong&gt;C# 13 e C# 14&lt;/strong&gt;, com exemplos práticos.&lt;/p&gt;


&lt;h1&gt;
  
  
  🧠 Visão Geral
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;C# 13&lt;/th&gt;
&lt;th&gt;C# 14&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Foco principal&lt;/td&gt;
&lt;td&gt;Performance e refinamentos de linguagem&lt;/td&gt;
&lt;td&gt;Simplificação e expressividade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Params collections&lt;/td&gt;
&lt;td&gt;Melhor suporte&lt;/td&gt;
&lt;td&gt;Expandido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pattern Matching&lt;/td&gt;
&lt;td&gt;Melhorias incrementais&lt;/td&gt;
&lt;td&gt;Mais expressivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ref structs&lt;/td&gt;
&lt;td&gt;Mais flexibilidade&lt;/td&gt;
&lt;td&gt;Evolução em segurança&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inicialização&lt;/td&gt;
&lt;td&gt;Mais controle&lt;/td&gt;
&lt;td&gt;Sintaxe ainda mais limpa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interoperabilidade&lt;/td&gt;
&lt;td&gt;Melhorias nativas&lt;/td&gt;
&lt;td&gt;Refinamento de cenários low-level&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  🧩 Principais Novidades do C# 13
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1️⃣ Params Collections
&lt;/h2&gt;

&lt;p&gt;Antes do C# 13, &lt;code&gt;params&lt;/code&gt; aceitava apenas arrays:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;params&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No C# 13, você pode usar &lt;strong&gt;outros tipos de coleção&lt;/strong&gt; como &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;params&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Benefício:&lt;br&gt;
Melhor performance e menos alocação desnecessária.&lt;/p&gt;


&lt;h2&gt;
  
  
  2️⃣ Melhorias em &lt;code&gt;ref struct&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O C# 13 flexibilizou restrições de &lt;code&gt;ref struct&lt;/code&gt;, permitindo uso mais amplo em cenários de alta performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;BufferProcessor&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Impacto:&lt;br&gt;
Mais controle em cenários de baixo nível e manipulação de memória.&lt;/p&gt;


&lt;h2&gt;
  
  
  3️⃣ Melhorias em Pattern Matching
&lt;/h2&gt;

&lt;p&gt;C# 13 trouxe pequenos refinamentos em expressões de padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Pequeno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Médio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Grande"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Código mais legível e expressivo.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Principais Evoluções do C# 14
&lt;/h1&gt;

&lt;p&gt;O C# 14 continua a linha de simplificação iniciada nas versões anteriores.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Inicialização Mais Simples
&lt;/h2&gt;

&lt;p&gt;Redução adicional de boilerplate em construções comuns.&lt;/p&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora (refinamento):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Mais conciso e moderno.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Pattern Matching Mais Poderoso
&lt;/h2&gt;

&lt;p&gt;Expressões ainda mais declarativas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Melhor leitura sem necessidade de múltiplas verificações.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Melhor Interoperabilidade com Código Nativo
&lt;/h2&gt;

&lt;p&gt;C# 14 aprimora cenários envolvendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Span&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Interop com código não gerenciado&lt;/li&gt;
&lt;li&gt;Otimizações JIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;stackalloc&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Menos alocação no heap → mais performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Melhorias Incrementais em Expressões
&lt;/h2&gt;

&lt;p&gt;Expansão da consistência sintática para manter a linguagem previsível.&lt;/p&gt;




&lt;h1&gt;
  
  
  🏗️ Impacto Arquitetural
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 Para aplicações corporativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Código mais legível&lt;/li&gt;
&lt;li&gt;Menos verbosidade&lt;/li&gt;
&lt;li&gt;Menos risco de erro humano&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Para sistemas de alta performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Melhor controle de memória&lt;/li&gt;
&lt;li&gt;Menos alocação desnecessária&lt;/li&gt;
&lt;li&gt;Maior previsibilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹 Para times grandes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Código mais consistente&lt;/li&gt;
&lt;li&gt;Melhor padronização&lt;/li&gt;
&lt;li&gt;Facilita revisão de código&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  📊 Comparação Prática
&lt;/h1&gt;

&lt;h3&gt;
  
  
  C# 13
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;params&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  C# 14
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"C#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Evolução"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diferença principal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C# 13 → foco técnico e performance&lt;/li&gt;
&lt;li&gt;C# 14 → foco em simplificação e fluidez&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧩 Quando Atualizar?
&lt;/h1&gt;

&lt;p&gt;Vale migrar quando:&lt;/p&gt;

&lt;p&gt;✅ O projeto já utiliza .NET 9 ou 10&lt;br&gt;
✅ Há necessidade de melhorias em performance&lt;br&gt;
✅ O time busca código mais moderno e limpo&lt;br&gt;
✅ O projeto é novo&lt;/p&gt;

&lt;p&gt;Evite migrar imediatamente se:&lt;br&gt;
⚠️ O projeto é legado e estável&lt;br&gt;
⚠️ Há dependência de ferramentas antigas&lt;/p&gt;




&lt;h1&gt;
  
  
  🔮 O Caminho do C
&lt;/h1&gt;

&lt;p&gt;A tendência do C# é clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mais expressivo&lt;/li&gt;
&lt;li&gt;Menos boilerplate&lt;/li&gt;
&lt;li&gt;Mais seguro&lt;/li&gt;
&lt;li&gt;Melhor para cloud-native&lt;/li&gt;
&lt;li&gt;Melhor para alto desempenho&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O foco deixou de ser apenas orientação a objetos e passou a abranger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programação funcional&lt;/li&gt;
&lt;li&gt;Padrões declarativos&lt;/li&gt;
&lt;li&gt;Performance de baixo nível&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ✅ Conclusão
&lt;/h1&gt;

&lt;p&gt;O C# 13 trouxe melhorias importantes focadas em &lt;strong&gt;performance e refinamentos estruturais&lt;/strong&gt;.&lt;br&gt;
O C# 14 avança na direção de &lt;strong&gt;simplificação e consistência sintática&lt;/strong&gt;, tornando o código ainda mais limpo e intuitivo.&lt;/p&gt;

&lt;p&gt;Ambas as versões demonstram maturidade da linguagem e compromisso com produtividade e eficiência.&lt;/p&gt;

&lt;p&gt;Para quem trabalha com .NET moderno, acompanhar essas mudanças é essencial para escrever código sustentável e preparado para o futuro.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com &lt;strong&gt;.NET moderno&lt;/strong&gt; e quer evoluir em temas como &lt;strong&gt;arquitetura, C#, DevOps e interoperabilidade&lt;/strong&gt;, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;DEV Community&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;br&gt;
📧 &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;Email&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bendizei, povos, ao nosso Deus, e fazei ouvir a voz do seu louvor. Ao que sustenta com vida a nossa alma, e não consente que sejam abalados os nossos pés. Salmos 66:8,9&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Integrando Sentry com .NET</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Wed, 28 Jan 2026 14:20:38 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/integrando-sentry-com-net-2pl1</link>
      <guid>https://dev.to/daniloopinheiro/integrando-sentry-com-net-2pl1</guid>
      <description>&lt;h2&gt;
  
  
  📖 Introdução
&lt;/h2&gt;

&lt;p&gt;O desenvolvimento de aplicações .NET modernas exige não apenas código funcional, mas também &lt;strong&gt;visibilidade completa sobre o comportamento do sistema em produção&lt;/strong&gt;. Monitoramento, rastreamento de erros e observabilidade tornaram-se componentes essenciais para garantir a confiabilidade e a capacidade de resposta de aplicações críticas.&lt;/p&gt;

&lt;p&gt;Este artigo apresenta uma abordagem prática para integrar o &lt;strong&gt;Sentry&lt;/strong&gt; em uma aplicação .NET 8, utilizando &lt;strong&gt;Vertical Slice Architecture&lt;/strong&gt; e padrões modernos como &lt;strong&gt;CQRS&lt;/strong&gt; e &lt;strong&gt;MediatR&lt;/strong&gt;. Demonstraremos como implementar monitoramento robusto, captura automática de exceções e rastreamento contextualizado de eventos.&lt;/p&gt;

&lt;p&gt;O projeto &lt;strong&gt;dopNetSentry&lt;/strong&gt; serve como exemplo prático, mostrando como combinar arquitetura limpa, padrões de design e ferramentas de observabilidade para criar soluções profissionais e sustentáveis.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Visão Geral do Projeto
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;dopNetSentry&lt;/strong&gt; é uma aplicação .NET 8 que demonstra a integração completa do SDK do Sentry para monitoramento e rastreamento automático de erros e exceções. O projeto utiliza uma arquitetura em camadas bem definida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Api&lt;/strong&gt;: Camada de apresentação com Minimal APIs&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Application&lt;/strong&gt;: Lógica de aplicação com CQRS (Commands e Queries)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Domain&lt;/strong&gt;: Entidades de domínio puras&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Infrastructure&lt;/strong&gt;: Persistência e integrações externas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa organização permite separação clara de responsabilidades, facilitando testes, manutenção e evolução do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Características Principais
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;.NET 8&lt;/strong&gt;: Utilizando a versão mais recente do framework&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Sentry SDK 6.0.0&lt;/strong&gt;: Monitoramento em tempo real de erros e exceções&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Vertical Slice Architecture&lt;/strong&gt;: Organização por funcionalidade&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CQRS com MediatR&lt;/strong&gt;: Separação entre leitura e escrita&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Entity Framework Core&lt;/strong&gt;: ORM para persistência de dados&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;FluentValidation&lt;/strong&gt;: Validação robusta de entrada&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Swagger/OpenAPI&lt;/strong&gt;: Documentação automática da API&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Componentes Fundamentais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Arquitetura em Camadas
&lt;/h3&gt;

&lt;p&gt;A aplicação segue o princípio de dependência unidirecional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Api → Application + Infrastructure
Application → Domain
Infrastructure → Domain + Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt; é a camada mais pura, sem dependências externas. &lt;strong&gt;Application&lt;/strong&gt; contém a lógica de negócio e depende apenas de Domain. &lt;strong&gt;Infrastructure&lt;/strong&gt; implementa detalhes técnicos e depende de Domain e Application. &lt;strong&gt;Api&lt;/strong&gt; é a camada de apresentação que orquestra tudo.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Padrão CQRS (Command Query Responsibility Segregation)
&lt;/h3&gt;

&lt;p&gt;O projeto utiliza MediatR para implementar CQRS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Commands&lt;/strong&gt;: Operações de escrita (Create, Update, Delete)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Queries&lt;/strong&gt;: Operações de leitura (Get, List)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Handlers&lt;/strong&gt;: Processam Commands e Queries de forma isolada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa separação permite otimizações independentes, escalabilidade e clareza no código.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Vertical Slice Architecture
&lt;/h3&gt;

&lt;p&gt;Ao invés de organizar por camadas técnicas (Controllers, Services, Repositories), o projeto organiza por funcionalidade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── src/
│   ├── netsentry.Api/                    # Camada de Apresentação
│   │   ├── Endpoints/
│   │   │   ├── WeatherForecastEndpoints.cs
│   │   │   └── SentryExamplesEndpoints.cs (comentado)
│   │   ├── Exceptions/
│   │   │   └── MyRpcException.cs
│   │   ├── Services/
│   │   │   └── SentryService.cs
│   │   ├── Program.cs
│   │   └── appsettings.json
│   ├── netsentry.Application/            # Camada de Aplicação
│   │   ├── Commands/                     # (vazio - pronto para uso)
│   │   ├── Interfaces/
│   │   │   └── IApplicationDbContext.cs
│   │   ├── Models/
│   │   │   └── WeatherForecastDto.cs
│   │   └── Queries/
│   │       ├── GetWeatherForecastQuery.cs
│   │       └── GetWeatherForecastQueryHandler.cs
│   ├── netsentry.Domain/                 # Camada de Domínio
│   │   └── Entities/
│   │       └── WeatherForecast.cs
│   └── netsentry.Infrastructure/         # Camada de Infraestrutura
│       └── Persistence/
│           └── ApplicationDbContext.cs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada funcionalidade contém tudo necessário para sua implementação, promovendo coesão e reduzindo acoplamento.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Integração com Sentry
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Configuração do Sentry
&lt;/h3&gt;

&lt;p&gt;O Sentry é configurado no &lt;code&gt;Program.cs&lt;/code&gt; usando o método &lt;code&gt;UseSentry&lt;/code&gt; no WebHost:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WebHost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseSentry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dsn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Sentry:Dsn"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Debug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Para ver o que o SDK está fazendo&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendDefaultPii&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Inclui headers, IP, etc.&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TracesSampleRate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 100% das transações&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnvironmentName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Filtro de exceções&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddExceptionFilterForType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OperationCanceledException&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Customização de eventos&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetBeforeSend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;@event&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica de customização&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;@event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Funcionalidades Implementadas
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Captura Automática de Exceções
&lt;/h4&gt;

&lt;p&gt;O Sentry captura automaticamente todas as exceções não tratadas. Para exceções tratadas, podemos usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Código que pode falhar&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CaptureException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Captura de Mensagens
&lt;/h4&gt;

&lt;p&gt;Para registrar eventos informativos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CaptureMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Operação iniciada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SentryLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Configuração de Contexto
&lt;/h4&gt;

&lt;p&gt;Adicionar informações contextuais aos eventos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"weatherforecast"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"request-time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Filtros de Exceção
&lt;/h4&gt;

&lt;p&gt;Ignorar tipos específicos de exceções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddExceptionFilterForType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OperationCanceledException&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. Customização com SetBeforeSend
&lt;/h4&gt;

&lt;p&gt;Modificar eventos antes de enviar ao Sentry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetBeforeSend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;@event&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;@event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;MyRpcException&lt;/span&gt; &lt;span class="n"&gt;rpcEx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;@event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetFingerprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"{{ default }}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;rpcEx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;rpcEx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;@event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemplo Prático: Endpoint WeatherForecast
&lt;/h3&gt;

&lt;p&gt;O endpoint &lt;code&gt;/weatherforecast&lt;/code&gt; demonstra a integração completa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMediator&lt;/span&gt; &lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Configurar contexto&lt;/span&gt;
        &lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"weatherforecast"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="c1"&gt;// Log de início&lt;/span&gt;
        &lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CaptureMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Iniciando busca de previsão do tempo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SentryLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GetWeatherForecastQuery&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Captura com contexto adicional&lt;/span&gt;
        &lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"error-type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetExtra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"error-message"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SentryLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="n"&gt;SentrySdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CaptureException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Problem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Testes e Qualidade
&lt;/h2&gt;

&lt;p&gt;A arquitetura implementada facilita a criação de testes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Testes Unitários&lt;/strong&gt;: Handlers podem ser testados isoladamente com mocks&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Testes de Integração&lt;/strong&gt;: Endpoints podem ser testados com banco em memória&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Testes de Observabilidade&lt;/strong&gt;: Verificar se eventos são enviados corretamente ao Sentry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A separação de responsabilidades permite isolar dependências e criar testes rápidos e confiáveis.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Observabilidade e Operação
&lt;/h2&gt;

&lt;p&gt;O Sentry fornece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monitoramento de Erros em Tempo Real&lt;/strong&gt;: Notificações instantâneas quando erros ocorrem&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Stack Traces Completos&lt;/strong&gt;: Veja exatamente onde e por que os erros acontecem&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Contexto Rico&lt;/strong&gt;: Informações sobre usuários afetados, ambiente, versão da aplicação&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance Insights&lt;/strong&gt;: Identifique gargalos e otimize a performance&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dashboard Interativo&lt;/strong&gt;: Visualize estatísticas e tendências&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como Obter o DSN do Sentry
&lt;/h3&gt;

&lt;p&gt;Para utilizar o Sentry em sua aplicação, você precisa criar uma conta no &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;Sentry.io&lt;/a&gt; e obter o DSN (Data Source Name) do seu projeto. Siga os passos abaixo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Criar uma Conta no Sentry.io&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse &lt;a href="https://sentry.io/signup/" rel="noopener noreferrer"&gt;https://sentry.io/signup/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crie uma conta gratuita (o plano gratuito oferece recursos suficientes para começar)&lt;/li&gt;
&lt;li&gt;Confirme seu email se necessário&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Criar uma Organização e Projeto&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Após fazer login, você será direcionado para criar uma organização&lt;/li&gt;
&lt;li&gt;Escolha um nome para sua organização&lt;/li&gt;
&lt;li&gt;Crie um novo projeto selecionando a plataforma &lt;strong&gt;.NET&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escolha um nome para o projeto (ex: "dopNetSentry")&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Obter o DSN&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Após criar o projeto, o Sentry exibirá uma tela de configuração&lt;/li&gt;
&lt;li&gt;O DSN estará visível no formato: &lt;code&gt;https://[chave]@[organização].ingest.sentry.io/[projeto-id]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Você também pode encontrar o DSN posteriormente em: &lt;strong&gt;Settings → Projects → [Seu Projeto] → Client Keys (DSN)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copiar o DSN&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copie o DSN completo fornecido pelo Sentry&lt;/li&gt;
&lt;li&gt;Este será o valor que você configurará no &lt;code&gt;appsettings.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: O DSN é uma chave pública que identifica seu projeto no Sentry. Embora seja seguro incluí-lo no código-fonte, é recomendado usar variáveis de ambiente ou Azure Key Vault em produção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Configuração via appsettings.json
&lt;/h3&gt;

&lt;p&gt;Após obter o DSN, configure-o no arquivo &lt;code&gt;appsettings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Sentry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Dsn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://[sua-chave]@[seu-org].ingest.sentry.io/[projeto-id]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SendDefaultPii"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"TracesSampleRate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Development"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua o valor de &lt;code&gt;Dsn&lt;/code&gt; pelo DSN real obtido na sua conta do Sentry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Boas Práticas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Não inclua dados sensíveis&lt;/strong&gt; nos logs ou contexto do Sentry&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Use filtros&lt;/strong&gt; para ignorar exceções esperadas (como OperationCanceledException)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configure ambientes&lt;/strong&gt; diferentes (Development, Staging, Production)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ajuste TracesSampleRate&lt;/strong&gt; em produção para controlar volume&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Desative Debug&lt;/strong&gt; em produção para melhor performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Segurança
&lt;/h2&gt;

&lt;p&gt;O projeto implementa várias práticas de segurança:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Validação de Entrada&lt;/strong&gt;: FluentValidation valida todos os dados de entrada&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Parameterized Queries&lt;/strong&gt;: Entity Framework Core usa queries parametrizadas automaticamente&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Object Level Authorization&lt;/strong&gt;: Verificação de permissões em endpoints&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Logging Seguro&lt;/strong&gt;: Não inclui dados sensíveis nos logs&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuração Segura&lt;/strong&gt;: DSN do Sentry via configuração, não hardcoded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas práticas garantem que a aplicação seja robusta e segura.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚧 Evolução e Sustentabilidade
&lt;/h2&gt;

&lt;p&gt;A arquitetura escolhida permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Evolução Incremental&lt;/strong&gt;: Adicionar novas funcionalidades sem impactar existentes&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Manutenibilidade&lt;/strong&gt;: Código organizado e fácil de entender&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Escalabilidade&lt;/strong&gt;: Estrutura preparada para crescimento&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Testabilidade&lt;/strong&gt;: Fácil de testar e validar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Vertical Slice Architecture promove coesão alta e acoplamento baixo, facilitando a evolução contínua do sistema.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;A integração do Sentry em aplicações .NET 8, combinada com uma arquitetura bem definida, proporciona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Visibilidade Completa&lt;/strong&gt;: Entenda o que acontece em produção&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Resposta Rápida&lt;/strong&gt;: Identifique e corrija problemas rapidamente&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Confiança&lt;/strong&gt;: Monitore a saúde da aplicação continuamente&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Melhoria Contínua&lt;/strong&gt;: Use dados reais para otimizar o sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto &lt;strong&gt;dopNetSentry&lt;/strong&gt; demonstra como combinar tecnologias modernas (.NET 8, Sentry) com padrões arquiteturais sólidos (Vertical Slice, CQRS) para criar aplicações profissionais, observáveis e sustentáveis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tecnologias mudam, mas bons fundamentos permanecem.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Recursos Adicionais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.sentry.io/platforms/dotnet/" rel="noopener noreferrer"&gt;Documentação do Sentry para .NET&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://jimmybogard.com/vertical-slice-architecture/" rel="noopener noreferrer"&gt;Vertical Slice Architecture - Jimmy Bogard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/jbogard/MediatR" rel="noopener noreferrer"&gt;MediatR Library&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.fluentvalidation.net/" rel="noopener noreferrer"&gt;FluentValidation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;DEV Community&lt;/a&gt;&lt;br&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📧 &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;Email&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Projeto&lt;/strong&gt;: &lt;a href="https://github.com/daniloopinheiro/dopNetSentry" rel="noopener noreferrer"&gt;dopNetSentry&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Versão&lt;/strong&gt;: 1.0.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Data&lt;/strong&gt;: Janeiro 2025&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;³ Porque assim diz o Senhor aos homens de Judá e a Jerusalém: Preparai para vós o campo de lavoura, e não semeeis entre espinhos. Jeremias 4:3&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>sentry</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>🚀 Desenvolvimento Full-Stack Moderno: TanStack Router + .NET</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Wed, 21 Jan 2026 19:13:41 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/desenvolvimento-full-stack-moderno-tanstack-router-net-1eg</link>
      <guid>https://dev.to/daniloopinheiro/desenvolvimento-full-stack-moderno-tanstack-router-net-1eg</guid>
      <description>&lt;h2&gt;
  
  
  ✨ Construindo Aplicações Web Escaláveis com Type-Safe Routing e APIs RESTful
&lt;/h2&gt;

&lt;p&gt;No cenário atual de desenvolvimento de software, a necessidade de criar aplicações web modernas, escaláveis e com excelente experiência do desenvolvedor é cada vez mais crítica. Este artigo apresenta uma abordagem prática para construir aplicações full-stack utilizando React com TanStack Router no frontend e ASP.NET Core no backend, demonstrando como essas tecnologias se complementam para criar soluções robustas e type-safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 Introdução
&lt;/h2&gt;

&lt;p&gt;O desenvolvimento de aplicações web modernas exige uma combinação harmoniosa entre frontend e backend, onde cada camada deve ser construída com as melhores ferramentas disponíveis. Enquanto o ecossistema JavaScript/TypeScript domina o frontend com frameworks como React, o .NET continua sendo uma das plataformas mais robustas para construção de APIs e serviços backend.&lt;/p&gt;

&lt;p&gt;Este artigo aborda a integração entre &lt;strong&gt;TanStack Router&lt;/strong&gt; — uma solução moderna de roteamento type-safe para React — e &lt;strong&gt;ASP.NET Core&lt;/strong&gt;, demonstrando como criar uma arquitetura full-stack que prioriza type safety, performance e manutenibilidade. Você aprenderá a configurar um projeto completo, desde a estrutura inicial até a implementação de rotas, APIs e integração entre as camadas.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Objetivo do Artigo
&lt;/h2&gt;

&lt;p&gt;Ao final deste artigo, você será capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entender os conceitos fundamentais&lt;/strong&gt; de roteamento type-safe com TanStack Router e construção de APIs RESTful com ASP.NET Core&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conhecer boas práticas&lt;/strong&gt; no ecossistema .NET moderno, incluindo configuração de CORS, documentação de APIs e estruturação de projetos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicar o conhecimento em cenários reais&lt;/strong&gt; através de um projeto prático que demonstra a integração completa entre frontend e backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar erros comuns&lt;/strong&gt; de implementação, como problemas de CORS, configuração incorreta de rotas SPA e falta de type safety&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Conceitos Fundamentais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TanStack Router: Roteamento Type-Safe
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TanStack Router&lt;/strong&gt; é uma biblioteca de roteamento para React que prioriza type safety e developer experience. Diferente de soluções tradicionais como React Router, o TanStack Router oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety Completo&lt;/strong&gt;: As rotas são tipadas em tempo de compilação, prevenindo erros comuns de navegação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Splitting Automático&lt;/strong&gt;: Divisão automática de código para otimização de performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File-Based Routing&lt;/strong&gt;: Sistema de rotas baseado em arquivos, similar ao Next.js, mas com mais flexibilidade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Loading Integrado&lt;/strong&gt;: Suporte nativo para carregamento de dados com estados de loading e erro&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ASP.NET Core: Framework Moderno para APIs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ASP.NET Core&lt;/strong&gt; é o framework web da Microsoft para construção de aplicações modernas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiplataforma&lt;/strong&gt;: Roda em Windows, Linux e macOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alto Desempenho&lt;/strong&gt;: Um dos frameworks web mais rápidos disponíveis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal APIs&lt;/strong&gt;: Sintaxe simplificada para criação de endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integração Nativa&lt;/strong&gt;: Suporte completo para JSON, CORS, autenticação e muito mais&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Type Safety no Full-Stack
&lt;/h3&gt;

&lt;p&gt;A type safety não deve ser limitada ao frontend. Ao usar TypeScript no React e C# no backend, garantimos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contratos Claros&lt;/strong&gt;: Interfaces e DTOs bem definidos entre frontend e backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detecção Precoce de Erros&lt;/strong&gt;: Problemas identificados em tempo de compilação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhor Autocomplete&lt;/strong&gt;: IDEs fornecem sugestões precisas em ambas as camadas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refatoração Segura&lt;/strong&gt;: Mudanças podem ser feitas com confiança&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Arquitetura e Estrutura
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Visão Geral da Arquitetura
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                    Frontend (React)                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│  │   TanStack   │  │  Components  │  │   State      │   │
│  │    Router    │  │   (React)    │  │  Management  │   │
│  └──────────────┘  └──────────────┘  └──────────────┘   │
│                          │                              │
│                          │ HTTP/REST                    │
└──────────────────────────┼──────────────────────────────┘
                           │
┌──────────────────────────┼──────────────────────────────┐
│                    Backend (.NET)                       │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│  │  Controllers │  │   Services   │  │   Data       │   │
│  │   (API)      │  │   (Business) │  │   Access     │   │
│  └──────────────┘  └──────────────┘  └──────────────┘   │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Organização de Camadas
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Frontend (React + TanStack Router)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── routes/              # Rotas baseadas em arquivos
│   ├── __root.tsx      # Rota raiz (layout principal)
│   ├── index.tsx       # Página inicial (/)
│   ├── about.tsx       # Página sobre (/about)
│   └── api-example.tsx # Exemplo de integração (/api-example)
├── components/          # Componentes reutilizáveis
├── hooks/              # Custom hooks
├── utils/              # Funções utilitárias
└── main.tsx           # Ponto de entrada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Princípios de Organização:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File-Based Routing&lt;/strong&gt;: Cada arquivo em &lt;code&gt;routes/&lt;/code&gt; representa uma rota&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Co-location&lt;/strong&gt;: Componentes relacionados ficam próximos às rotas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separação de Responsabilidades&lt;/strong&gt;: Lógica de negócio separada de apresentação&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Backend (ASP.NET Core)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NetTanstack.Api/
├── Controllers/        # Controladores da API
│   └── WeatherForecastController.cs
├── Services/          # Serviços de negócio
├── Models/            # Modelos e DTOs
├── Program.cs         # Configuração e pipeline
└── appsettings.json   # Configurações
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Princípios de Organização:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Controller-Based&lt;/strong&gt;: Organização por recursos/funcionalidades&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Injection&lt;/strong&gt;: Uso extensivo de DI para desacoplamento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal APIs&lt;/strong&gt;: Endpoints simples podem usar Minimal APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comunicação entre Componentes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frontend → Backend&lt;/strong&gt;: Requisições HTTP via &lt;code&gt;fetch&lt;/code&gt; ou bibliotecas como Axios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend → Frontend&lt;/strong&gt;: Respostas JSON tipadas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Contratos definidos em TypeScript (frontend) e C# (backend)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Impactos em Escalabilidade e Manutenção
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade Horizontal&lt;/strong&gt;: Backend pode ser escalado independentemente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy Independente&lt;/strong&gt;: Frontend e backend podem ser deployados separadamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenibilidade&lt;/strong&gt;: Código organizado e type-safe facilita manutenção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade&lt;/strong&gt;: Separação clara permite testes isolados&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Implementação no .NET
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Estrutura de Projeto
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Configuração do Backend (ASP.NET Core)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Program.cs&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Adicionar serviços&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddControllers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEndpointsApiExplorer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSwaggerGen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Configurar CORS para permitir requisições do frontend&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AllowReactApp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithOrigins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:5173"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyMethod&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Configurar pipeline&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsDevelopment&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseSwagger&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseSwaggerUI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseCors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AllowReactApp"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseHttpsRedirection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapControllers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo de Minimal API&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá do backend .NET!"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Por que essas decisões?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CORS Configurado&lt;/strong&gt;: Permite comunicação entre frontend e backend em desenvolvimento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger em Desenvolvimento&lt;/strong&gt;: Facilita testes e documentação da API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal APIs&lt;/strong&gt;: Sintaxe mais limpa para endpoints simples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controllers&lt;/strong&gt;: Melhor para endpoints mais complexos com múltiplas ações&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Exemplo de Controller
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Controllers/WeatherForecastController.cs&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ApiController&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherForecastController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;Summaries&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"Congelante"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Frio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Fresco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ameno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Quente"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Tropical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Escaldante"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;WeatherForecast&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;WeatherForecast&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="n"&gt;TemperatureC&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shared&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;55&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;Summary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Summaries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shared&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Summaries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;WeatherForecast&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateOnly&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;TemperatureC&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;TemperatureF&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;TemperatureC&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;0.5556&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Boas Práticas Aplicadas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Records para DTOs&lt;/strong&gt;: Sintaxe concisa e imutabilidade por padrão&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atributos de Roteamento&lt;/strong&gt;: &lt;code&gt;[ApiController]&lt;/code&gt; e &lt;code&gt;[Route]&lt;/code&gt; para convenções claras&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separação de Responsabilidades&lt;/strong&gt;: Controller apenas coordena, lógica em serviços (em projetos maiores)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuração do Frontend (React + TanStack Router)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Configuração do Vite
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// vite.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Plugin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vitejs/plugin-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tanstackRouter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/router-plugin/vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;IncomingMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ServerResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:connect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Plugin para garantir fallback para index.html em todas as rotas (SPA)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;spaFallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Plugin&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;spa-fallback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;configureServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;middlewares&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IncomingMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ServerResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;tanstackRouter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;autoCodeSplitting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nf"&gt;react&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;spaFallback&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5173&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:5000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;changeOrigin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Decisões Técnicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plugin SPA Fallback&lt;/strong&gt;: Garante que recarregar qualquer rota funcione corretamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy para API&lt;/strong&gt;: Redireciona &lt;code&gt;/api/*&lt;/code&gt; para o backend, evitando problemas de CORS em desenvolvimento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto Code Splitting&lt;/strong&gt;: TanStack Router divide automaticamente o código por rota&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Estrutura de Rotas
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/routes/__root.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createRootRoute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Outlet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/react-router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TanStackRouterDevtools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/react-router-devtools&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RootLayout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;nav&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main-nav&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nav-container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nav-link [&amp;amp;.active]:font-bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Home&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nav-link [&amp;amp;.active]:font-bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Sobre&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api-example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nav-link [&amp;amp;.active]:font-bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/nav&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main-content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Outlet&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TanStackRouterDevtools&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createRootRoute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RootLayout&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/routes/api-example.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createFileRoute&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/react-router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createFileRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api-example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)({&lt;/span&gt;
  &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ApiExample&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;WeatherForecast&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;temperatureC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;temperatureF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ApiExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;WeatherForecast&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/weatherforecast&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Erro ao buscar dados&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Erro desconhecido&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;page-container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* UI do componente */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Por que essa abordagem?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File-Based Routing&lt;/strong&gt;: Rotas definidas por arquivos, facilitando navegação e manutenção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Interface &lt;code&gt;WeatherForecast&lt;/code&gt; garante que os dados da API sejam tipados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Tratamento adequado de erros e estados de loading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of Concerns&lt;/strong&gt;: Lógica de fetch separada da apresentação&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Boas Práticas e Cuidados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Evitar Acoplamento Excessivo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;❌ Ruim:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Frontend conhece detalhes de implementação do backend&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:5000/api/weatherforecast&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// Sem validação de tipos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Bom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Abstração através de serviços&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;weatherService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/services/weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;weatherService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getForecast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// Tipos garantidos, fácil de mockar em testes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Garantir Testabilidade
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Dependency Injection para todos os serviços&lt;/li&gt;
&lt;li&gt;Separe lógica de negócio dos controllers&lt;/li&gt;
&lt;li&gt;Crie interfaces para dependências externas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extraia lógica de fetch para hooks customizados&lt;/li&gt;
&lt;li&gt;Use serviços para comunicação com API&lt;/li&gt;
&lt;li&gt;Facilite mocking em testes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Pensar em Observabilidade
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Adicionar logging estruturado&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddLogging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddConsole&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSeq&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Ou outro sistema de logging&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Logar requisições importantes&lt;/span&gt;
&lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Weather forecast requested at {Time}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Tratar Falhas e Exceções Corretamente
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Middleware global de tratamento de exceções&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseExceptionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appBuilder&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;appBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IExceptionHandlerFeature&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"An error occurred"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;
            &lt;span class="p"&gt;}));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Tratamento consistente de erros&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/weatherforecast&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP error! status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// processar dados&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Logar erro e mostrar mensagem amigável ao usuário&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch weather data:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Não foi possível carregar os dados. Tente novamente.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Considerar Segurança desde o Início
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CORS&lt;/strong&gt;: Configure apenas origens necessárias em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação de Input&lt;/strong&gt;: Sempre valide dados recebidos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS&lt;/strong&gt;: Force HTTPS em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting&lt;/strong&gt;: Implemente limites de requisição&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autenticação&lt;/strong&gt;: Use JWT ou OAuth2 para APIs protegidas
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// CORS mais restritivo em produção&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsProduction&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AllowReactApp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithOrigins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://meudominio.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyMethod&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowCredentials&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Benefícios da Abordagem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Código Mais Limpo e Organizado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Erros detectados em tempo de compilação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estrutura Clara&lt;/strong&gt;: File-based routing facilita navegação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convenções&lt;/strong&gt;: Padrões consistentes reduzem decisões arbitrárias&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Facilidade de Manutenção
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Separação de Responsabilidades&lt;/strong&gt;: Frontend e backend independentes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refatoração Segura&lt;/strong&gt;: TypeScript e C# permitem refatorações com confiança&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação&lt;/strong&gt;: Swagger gera documentação automática da API&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escalabilidade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploy Independente&lt;/strong&gt;: Escalar frontend e backend separadamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Code splitting automático otimiza carregamento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura Flexível&lt;/strong&gt;: Fácil adicionar novos serviços ou features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Melhor Experiência para Times de Desenvolvimento
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer Experience&lt;/strong&gt;: Autocomplete preciso, erros claros&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot Reload&lt;/strong&gt;: Mudanças refletidas instantaneamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevTools&lt;/strong&gt;: TanStack Router DevTools facilitam debug&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Menor Risco em Produção
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Previne erros de runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade&lt;/strong&gt;: Código testável por design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidade&lt;/strong&gt;: Logging e monitoramento facilitados&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚧 Desafios Comuns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Complexidade Desnecessária
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Adicionar muitas camadas e abstrações sem necessidade real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; Comece simples. Adicione complexidade apenas quando necessário. Um controller direto pode ser suficiente para APIs simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Uso Incorreto de Ferramentas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Usar TanStack Router para aplicações muito simples onde React Router seria suficiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; Avalie as necessidades do projeto. TanStack Router brilha em aplicações complexas com muitas rotas e necessidade de type safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Falta de Padronização
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Diferentes padrões de nomenclatura, estrutura de pastas e estilos de código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; Estabeleça convenções desde o início e documente-as. Use ferramentas como ESLint e EditorConfig para manter consistência.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Dificuldade de Evolução sem Refatoração
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Código acoplado dificulta adicionar novas features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Dependency Injection&lt;/li&gt;
&lt;li&gt;Separe lógica de negócio de apresentação&lt;/li&gt;
&lt;li&gt;Crie interfaces para dependências&lt;/li&gt;
&lt;li&gt;Escreva testes que facilitem refatoração&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Problemas de CORS em Produção
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; Configuração de CORS muito permissiva ou incorreta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; Configure CORS específico para cada ambiente. Em produção, liste apenas origens necessárias.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;Este artigo apresentou uma abordagem prática para construir aplicações full-stack modernas utilizando React com TanStack Router no frontend e ASP.NET Core no backend. Através da combinação dessas tecnologias, conseguimos criar soluções que priorizam type safety, performance e manutenibilidade.&lt;/p&gt;

&lt;p&gt;Os principais pontos abordados foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conceitos fundamentais&lt;/strong&gt; de roteamento type-safe e construção de APIs RESTful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura moderna&lt;/strong&gt; com separação clara de responsabilidades&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação prática&lt;/strong&gt; com exemplos de código reais&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boas práticas&lt;/strong&gt; para garantir qualidade e sustentabilidade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desafios comuns&lt;/strong&gt; e como evitá-los&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A escolha de tecnologias modernas como TanStack Router e ASP.NET Core, combinada com boas práticas de arquitetura, resulta em aplicações mais robustas, escaláveis e fáceis de manter. A type safety em ambas as camadas (TypeScript e C#) reduz significativamente erros em runtime e melhora a experiência de desenvolvimento.&lt;/p&gt;

&lt;p&gt;É importante lembrar que boas decisões arquiteturais e técnicas impactam diretamente a qualidade, a escalabilidade e a longevidade das aplicações. Investir tempo em estruturação adequada e escolha de ferramentas apropriadas paga dividendos a longo prazo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Próximos Passos:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Experimente o projeto de exemplo e adapte para suas necessidades&lt;/li&gt;
&lt;li&gt;Explore recursos avançados do TanStack Router como data loading e route masking&lt;/li&gt;
&lt;li&gt;Implemente autenticação e autorização na API&lt;/li&gt;
&lt;li&gt;Adicione testes unitários e de integração&lt;/li&gt;
&lt;li&gt;Configure CI/CD para deploy automatizado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aplique esses conceitos de forma gradual e consciente, sempre avaliando as necessidades específicas do seu projeto. Comece simples e evolua conforme a complexidade aumenta.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://linkedin.com/in/seu-perfil" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;Dev.to&lt;/a&gt;&lt;br&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;&lt;br&gt;
✍️ &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;a href="//daniloopinheiro@dopme.io"&gt;Email&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Referências e Recursos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tanstack.com/router/latest" rel="noopener noreferrer"&gt;Documentação TanStack Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/aspnet/core/" rel="noopener noreferrer"&gt;Documentação ASP.NET Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/" rel="noopener noreferrer"&gt;TypeScript Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>desenvolvimentoweb</category>
      <category>webdev</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Adeus, Swagger UI ? Uma alternativa elegante com Redoc</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Sat, 10 Jan 2026 17:06:46 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/adeus-swagger-ui-uma-alternativa-elegante-com-redoc-3024</link>
      <guid>https://dev.to/daniloopinheiro/adeus-swagger-ui-uma-alternativa-elegante-com-redoc-3024</guid>
      <description>&lt;p&gt;Neste artigo, vamos explorar como criar uma API RESTful completa em .NET 8 usando Minimal APIs, implementando um CRUD (Create, Read, Update, Delete) completo para cadastro de pessoas. Além disso, vamos integrar OpenAPI/Swagger para documentação automática e Redoc para uma interface de documentação interativa e elegante.&lt;/p&gt;

&lt;p&gt;O projeto demonstra as melhores práticas modernas de desenvolvimento .NET, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal APIs&lt;/strong&gt; para endpoints limpos e diretos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação de dados&lt;/strong&gt; com Data Annotations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação automática&lt;/strong&gt; com OpenAPI 3.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface de documentação&lt;/strong&gt; com Redoc&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura em camadas&lt;/strong&gt; com serviços e modelos separados&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Tecnologias Utilizadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;.NET 8.0&lt;/strong&gt; - Framework moderno e de alto desempenho&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal APIs&lt;/strong&gt; - Abordagem simplificada para criar APIs REST&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swashbuckle.AspNetCore&lt;/strong&gt; - Geração automática de documentação OpenAPI/Swagger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redoc&lt;/strong&gt; - Interface de documentação interativa e elegante&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Annotations&lt;/strong&gt; - Validação de dados nativa do .NET&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📁 Estrutura do Projeto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NR.Api/
├── Models/
│   ├── Pessoa.cs                  # Modelo de domínio
│   ├── CriarPessoaRequest.cs      # DTO para criação
│   └── AtualizarPessoaRequest.cs  # DTO para atualização
├── Services/
│   ├── IPessoaService.cs          # Interface do serviço
│   └── PessoaService.cs           # Implementação do serviço (em memória)
├── Properties/
│   └── launchSettings.json        # Configurações de execução
├── wwwroot/
│   ├── index.html                 # Página inicial
│   └── redoc.html                 # Interface Redoc
├── Program.cs                     # Configuração e endpoints
└── NR.Api.csproj                  # Arquivo do projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Como Executar o Projeto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pré-requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dotnet.microsoft.com/download/dotnet/8.0" rel="noopener noreferrer"&gt;.NET 8 SDK&lt;/a&gt; instalado&lt;/li&gt;
&lt;li&gt;Visual Studio 2022, VS Code ou Rider (opcional)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Passos para Executar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone ou navegue até o diretório do projeto&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;NR.Api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restaura as dependências&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet restore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Execute a aplicação&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Acesse a documentação&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redoc&lt;/strong&gt;: &lt;a href="http://localhost:5059/" rel="noopener noreferrer"&gt;http://localhost:5059/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger UI&lt;/strong&gt;: &lt;a href="http://localhost:5059/swagger" rel="noopener noreferrer"&gt;http://localhost:5059/swagger&lt;/a&gt; (apenas em Development)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Modelos de Dados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pessoa (Modelo de Domínio)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Telefone&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;DataNascimento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Endereco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;DataCriacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;DataAtualizacao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CriarPessoaRequest (DTO de Criação)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CriarPessoaRequest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"O nome é obrigatório"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;StringLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MinimumLength&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"O email é obrigatório"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;EmailAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"O email deve ser válido"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"O telefone é obrigatório"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;StringLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MinimumLength&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Telefone&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"A data de nascimento é obrigatória"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;DataNascimento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;StringLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Endereco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AtualizarPessoaRequest (DTO de Atualização)
&lt;/h3&gt;

&lt;p&gt;Similar ao &lt;code&gt;CriarPessoaRequest&lt;/code&gt;, usado para atualização de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔌 Endpoints da API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Health Check
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/health&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retorna o status de saúde da aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resposta:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"healthy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Listar Todas as Pessoas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/pessoas&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retorna uma lista com todas as pessoas cadastradas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resposta (200 OK):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"João Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"joao.silva@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 98765-4321"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1990-05-15T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rua Exemplo, 123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dataCriacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dataAtualizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Obter Pessoa por ID
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/pessoas/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retorna os dados de uma pessoa específica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; (Guid): ID único da pessoa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resposta (200 OK):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"João Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"joao.silva@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 98765-4321"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1990-05-15T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rua Exemplo, 123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataCriacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataAtualizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resposta (404 Not Found):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pessoa com ID {id} não encontrada"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Criar Nova Pessoa
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/pessoas&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cria uma nova pessoa no sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body (JSON):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Santos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.santos@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 91234-5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1985-08-20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avenida Principal, 456"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resposta (201 Created):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"660e8400-e29b-41d4-a716-446655440001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Santos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.santos@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 91234-5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1985-08-20T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avenida Principal, 456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataCriacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:15:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataAtualizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resposta (400 Bad Request):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"O nome é obrigatório"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"O email deve ser válido"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Atualizar Pessoa
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt; &lt;code&gt;/api/pessoas/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualiza os dados de uma pessoa existente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; (Guid): ID único da pessoa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Body (JSON):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Santos Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.silva@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 91234-5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1985-08-20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avenida Principal, 456 - Apto 101"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resposta (200 OK):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"660e8400-e29b-41d4-a716-446655440001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Santos Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.silva@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telefone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(11) 91234-5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataNascimento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1985-08-20T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avenida Principal, 456 - Apto 101"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataCriacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:15:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataAtualizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-09T10:20:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Deletar Pessoa
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt; &lt;code&gt;/api/pessoas/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Remove uma pessoa do sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; (Guid): ID único da pessoa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resposta (204 No Content):&lt;/strong&gt; Sem corpo de resposta&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resposta (404 Not Found):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pessoa com ID {id} não encontrada"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💻 Implementação do Serviço
&lt;/h2&gt;

&lt;p&gt;O serviço &lt;code&gt;PessoaService&lt;/code&gt; utiliza um dicionário em memória para armazenar os dados. Em uma aplicação de produção, você substituiria isso por um banco de dados (SQL Server, PostgreSQL, MongoDB, etc.).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPessoaService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pessoas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;_lock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;CriarAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CriarPessoaRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;lock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Telefone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Telefone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;DataNascimento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataNascimento&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Endereco&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Endereco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;DataCriacao&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="n"&gt;_pessoas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ... outros métodos&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Validação de Dados
&lt;/h2&gt;

&lt;p&gt;O projeto utiliza &lt;strong&gt;Data Annotations&lt;/strong&gt; para validação de dados. As validações incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Required&lt;/strong&gt;: Campos obrigatórios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EmailAddress&lt;/strong&gt;: Validação de formato de email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StringLength&lt;/strong&gt;: Limitação de tamanho de strings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MinimumLength&lt;/strong&gt;: Tamanho mínimo de strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de validação no endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;validationResults&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ValidationResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;validationContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ValidationContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;Validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryValidateObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validationContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validationResults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BadRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validationResults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ErrorMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧪 Testando a API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usando cURL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Listar pessoas:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET http://localhost:5059/api/pessoas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Criar pessoa:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:5059/api/pessoas &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "nome": "João Silva",
    "email": "joao.silva@email.com",
    "telefone": "(11) 98765-4321",
    "dataNascimento": "1990-05-15",
    "endereco": "Rua Exemplo, 123"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Atualizar pessoa:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT http://localhost:5059/api/pessoas/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "nome": "João Silva Santos",
    "email": "joao.santos@email.com",
    "telefone": "(11) 98765-4321",
    "dataNascimento": "1990-05-15",
    "endereco": "Rua Exemplo, 123"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Deletar pessoa:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE http://localhost:5059/api/pessoas/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando Postman ou Insomnia
&lt;/h3&gt;

&lt;p&gt;Importe a especificação OpenAPI disponível em &lt;code&gt;/swagger/v1/swagger.json&lt;/code&gt; no Postman ou Insomnia para ter acesso a todos os endpoints pré-configurados.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Documentação com OpenAPI e Redoc
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenAPI/Swagger
&lt;/h3&gt;

&lt;p&gt;O projeto utiliza &lt;strong&gt;Swashbuckle.AspNetCore&lt;/strong&gt; para gerar automaticamente a documentação OpenAPI 3.0. A especificação OpenAPI está disponível em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt;: &lt;a href="http://localhost:5059/swagger/v1/swagger.json" rel="noopener noreferrer"&gt;http://localhost:5059/swagger/v1/swagger.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger UI&lt;/strong&gt;: &lt;a href="http://localhost:5059/swagger" rel="noopener noreferrer"&gt;http://localhost:5059/swagger&lt;/a&gt; (apenas em Development)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gerando HTML Estático com Redocly CLI para Produção
&lt;/h3&gt;

&lt;p&gt;Para ambiente de produção, é recomendado gerar uma versão estática da documentação usando o Redocly CLI. Isso oferece melhor performance e pode ser servido por qualquer servidor web estático.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo A — Instalar Redocly CLI (Node)
&lt;/h4&gt;

&lt;p&gt;Primeiro, instale o Redocly CLI globalmente usando npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @redocly/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: É necessário ter o Node.js instalado em sua máquina. Você pode baixá-lo em &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;nodejs.org&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo B — Gerar o OpenAPI JSON localmente
&lt;/h4&gt;

&lt;p&gt;Com a API rodando, baixe o arquivo JSON da especificação OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:5059/swagger/v1/swagger.json &lt;span class="nt"&gt;-o&lt;/span&gt; openapi.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou, no Windows PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://localhost:5059/swagger/v1/swagger.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-OutFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;openapi.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Passo C — Gerar o HTML do Redoc
&lt;/h4&gt;

&lt;p&gt;Execute o comando para gerar o HTML estático:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redocly build-docs openapi.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria um arquivo &lt;code&gt;redoc-static.html&lt;/code&gt; no diretório atual.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo D — Colocar o HTML no wwwroot
&lt;/h4&gt;

&lt;p&gt;Agora você pode mover o arquivo gerado para o diretório &lt;code&gt;wwwroot&lt;/code&gt; e servi-lo diretamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; wwwroot
&lt;span class="nb"&gt;mv &lt;/span&gt;redoc-static.html wwwroot/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou, no Windows PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wwwroot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Move-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;redoc-static.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wwwroot/index.html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora abra &lt;a href="http://localhost:5059/index.html" rel="noopener noreferrer"&gt;http://localhost:5059/index.html&lt;/a&gt; para ver a documentação estática.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vantagens do Redocly CLI
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Configuração personalizada&lt;/strong&gt;: Diferentes opções de configuração e temas&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Lint e validação&lt;/strong&gt;: Valida a especificação OpenAPI antes de gerar&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Bundle da spec&lt;/strong&gt;: Consolida referências externas em um único arquivo&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Builds automatizados&lt;/strong&gt;: Integra facilmente em pipelines de CI/CD&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Deploy estático&lt;/strong&gt;: Pode ser servido por qualquer servidor web estático (Nginx, Azure Static Web Apps, GitHub Pages, etc.)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Melhor performance&lt;/strong&gt;: HTML estático carrega mais rápido que versões dinâmicas&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exemplo de Configuração Avançada
&lt;/h4&gt;

&lt;p&gt;Você também pode criar um arquivo de configuração &lt;code&gt;redocly.yaml&lt;/code&gt; para personalizar a geração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openapi.json&lt;/span&gt;
&lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;colors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#32329f'&lt;/span&gt;
  &lt;span class="na"&gt;typography&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;14px'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redocly build-docs openapi.json &lt;span class="nt"&gt;--config&lt;/span&gt; redocly.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔒 Próximos Passos e Melhorias
&lt;/h2&gt;

&lt;p&gt;Para tornar esta API pronta para produção, considere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Persistência de Dados&lt;/strong&gt;: Substituir o dicionário em memória por um banco de dados (Entity Framework Core, Dapper, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autenticação e Autorização&lt;/strong&gt;: Implementar JWT, OAuth 2.0 ou Identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging&lt;/strong&gt;: Adicionar logging estruturado (Serilog, NLog)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tratamento de Erros Global&lt;/strong&gt;: Middleware para tratamento centralizado de exceções&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting&lt;/strong&gt;: Limitar requisições por IP/usuário&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt;: Implementar cache para consultas frequentes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versionamento de API&lt;/strong&gt;: Suporte para múltiplas versões da API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes Automatizados&lt;/strong&gt;: Unit tests e integration tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: Pipeline de build e deploy automatizado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoramento&lt;/strong&gt;: Application Insights, Prometheus, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📖 Conclusão
&lt;/h2&gt;

&lt;p&gt;Este projeto demonstra como criar uma API RESTful completa e moderna usando .NET 8 com Minimal APIs. Através do uso de OpenAPI e Redoc, conseguimos gerar documentação automática e interativa, facilitando o desenvolvimento e a integração com outros sistemas.&lt;/p&gt;

&lt;p&gt;As Minimal APIs do .NET 8 oferecem uma abordagem simplificada e performática para criar APIs REST, enquanto o OpenAPI e Redoc garantem uma experiência de documentação profissional e acessível.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💻 &lt;a href="http://dev.to/"&gt;DEV Community&lt;/a&gt;&lt;br&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📰 &lt;a href="https://substack.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📧 &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;Email&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⁷ Agora, pois, seja o temor do Senhor convosco; guardai-o, e fazei-o; porque não há no Senhor nosso Deus iniquidade nem acepção de pessoas, nem aceitação de suborno. 2 Crônicas 19:7&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🛠️ Do `.SLN` para `.SLNX` no .NET: O que Mudou e Por quê</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Wed, 07 Jan 2026 21:46:20 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/do-sln-para-slnx-no-net-o-que-mudou-e-por-que-1bdo</link>
      <guid>https://dev.to/daniloopinheiro/do-sln-para-slnx-no-net-o-que-mudou-e-por-que-1bdo</guid>
      <description>&lt;p&gt;O Visual Studio e o ecossistema .NET utilizam há anos arquivos de &lt;strong&gt;solução (&lt;code&gt;.sln&lt;/code&gt;)&lt;/strong&gt; para agrupar e organizar projetos dentro de uma solução maior. Porém, com a chegada do &lt;strong&gt;.NET 10&lt;/strong&gt; e evoluções recentes do SDK e do CLI, um &lt;strong&gt;novo formato chamado &lt;code&gt;.slnx&lt;/code&gt;&lt;/strong&gt; está sendo adotado como alternativa &lt;strong&gt;mais moderna, legível e sustentável&lt;/strong&gt; nos fluxos de desenvolvimento.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 1. O Problema com &lt;code&gt;.sln&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O formato tradicional de arquivo &lt;code&gt;.sln&lt;/code&gt; existe há décadas e foi projetado quando a &lt;strong&gt;Visual Studio era o centro do desenvolvimento Windows&lt;/strong&gt;. Ele possui diversas características que hoje se tornaram limitantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📄 Formato de texto plano com muitos &lt;strong&gt;GUIDs&lt;/strong&gt;, seções e metadados redundantes.&lt;/li&gt;
&lt;li&gt;🔀 &lt;strong&gt;Merge conflicts&lt;/strong&gt; frequentes em sistemas de controle de versão (como Git).&lt;/li&gt;
&lt;li&gt;✍️ Difícil de editar ou entender manualmente sem experiência.&lt;/li&gt;
&lt;li&gt;🧠 Pouca compatibilidade com ferramentas automatizadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse formato “cresceu orgânico” com o tempo, acumulando &lt;strong&gt;configurações duplicadas e ruído&lt;/strong&gt;, o que dificulta sua manutenção — principalmente em projetos grandes ou desenvolvidos por muitas pessoas.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ 2. Por que o &lt;code&gt;.slnx&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Visando &lt;strong&gt;simplificar, modernizar e facilitar o trabalho em equipe&lt;/strong&gt;, a Microsoft introduziu um novo formato de solução chamado &lt;strong&gt;&lt;code&gt;.slnx&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Principais Motivações:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧾 &lt;strong&gt;Menos verbosidade:&lt;/strong&gt; arquivo mais curto e fácil de ler.&lt;/li&gt;
&lt;li&gt;🛠️ &lt;strong&gt;Formato XML:&lt;/strong&gt; padrão universal, compatível com ferramentas automatizadas.&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Menos conflitos em Git:&lt;/strong&gt; estrutura mais estável reduz diffs problemáticos.&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Ferramentas de build integradas:&lt;/strong&gt; MSBuild e .NET CLI já suportam &lt;code&gt;.slnx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;🧑‍💻 &lt;strong&gt;Melhor manutenção:&lt;/strong&gt; é mais simples combinar com scripts e automações.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🆕 3. O que mudou no formato
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🗂 Estrutura
&lt;/h3&gt;

&lt;p&gt;A diferença é clara quando comparamos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes — &lt;code&gt;.sln&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Formato antigo com GUIDs e várias seções
Microsoft Visual Studio Solution File, Format Version 12.00
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
EndGlobal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agora — &lt;code&gt;.slnx&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Solution&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Path=&lt;/span&gt;&lt;span class="s"&gt;"WebApi/WebApi.csproj"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Path=&lt;/span&gt;&lt;span class="s"&gt;"Domain/Domain.csproj"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Solution&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O novo formato usa XML simples e direto, sem GUIDs, seções longas ou metadados desnecessários — deixando claro &lt;strong&gt;quais projetos pertencem à solução&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 4. Quando isso começou?
&lt;/h2&gt;

&lt;p&gt;O suporte ao &lt;code&gt;.slnx&lt;/code&gt; foi introduzido inicialmente como &lt;strong&gt;preview&lt;/strong&gt; no SDK do .NET a partir da versão &lt;strong&gt;9.0.200&lt;/strong&gt;, com suporte gradativo em CLI e ferramentas como MSBuild.&lt;/p&gt;

&lt;p&gt;Com o lançamento do &lt;strong&gt;.NET 10&lt;/strong&gt;, o comando padrão usado por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new sln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;passou a gerar &lt;strong&gt;por padrão arquivos &lt;code&gt;.slnx&lt;/code&gt;&lt;/strong&gt; em vez de &lt;code&gt;.sln&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ 5. Como funciona no dia a dia
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🆕 Criando uma solução com &lt;code&gt;.slnx&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ao rodar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new sln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você obterá um arquivo &lt;code&gt;.slnx&lt;/code&gt; por padrão, com estrutura XML simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Migrando de &lt;code&gt;.sln&lt;/code&gt; para &lt;code&gt;.slnx&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Você pode migrar uma solução antiga usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet sln migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou, em Visual Studio (quando a opção estiver habilitada), &lt;strong&gt;salvar o arquivo em novo formato&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧰 Opções da CLI
&lt;/h3&gt;

&lt;p&gt;Se você ainda deseja gerar o formato clássico &lt;code&gt;.sln&lt;/code&gt;, pode fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new sln &lt;span class="nt"&gt;--format&lt;/span&gt; sln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;— útil ao manter compatibilidade com ferramentas antigas ou fluxos de trabalho específicos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 6. Ferramentas e compatibilidade
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧑‍💻 Visual Studio
&lt;/h3&gt;

&lt;p&gt;O suporte ao &lt;code&gt;.slnx&lt;/code&gt; já está presente, mas em algumas versões é necessário &lt;strong&gt;ativar a opção nas configurações de Preview Features&lt;/strong&gt; para garantir que o Visual Studio entenda o novo formato.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 MSBuild
&lt;/h3&gt;

&lt;p&gt;O MSBuild &lt;strong&gt;suporta totalmente arquivos &lt;code&gt;.slnx&lt;/code&gt;&lt;/strong&gt;, permitindo builds, testes e operações usuais sem impactos significativos.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 CLI e ferramentas de terceiros
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;dotnet sln&lt;/code&gt; agora pode &lt;strong&gt;listar e modificar projetos em &lt;code&gt;.slnx&lt;/code&gt;&lt;/strong&gt;, além de migrar soluções antigas.&lt;/p&gt;

&lt;p&gt;Há também bibliotecas como &lt;strong&gt;Microsoft.VisualStudio.SolutionPersistence&lt;/strong&gt; para manipular &lt;code&gt;.slnx&lt;/code&gt; programaticamente — útil em scripts ou ferramentas de automação.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 7. Principais Benefícios do &lt;code&gt;.slnx&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;🧠 &lt;strong&gt;Human-readable:&lt;/strong&gt; Mais fácil de ler e editar manualmente.&lt;br&gt;
🔄 &lt;strong&gt;Menos conflitos no Git:&lt;/strong&gt; Comentários redundantes e GUIDs eram armadilhas para merge.&lt;br&gt;
⚙ &lt;strong&gt;Ferramentas harmonizadas:&lt;/strong&gt; MSBuild, CLI e IDEs conseguem trabalhar melhor com formato estruturado.&lt;br&gt;
🛠 &lt;strong&gt;Automação facilitada:&lt;/strong&gt; Scripts e ferramentas podem gerar e modificar soluções com mais segurança.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ 8. Pontos de Atenção
&lt;/h2&gt;

&lt;p&gt;✔️ As equipes devem &lt;strong&gt;evitar manter ambos &lt;code&gt;.sln&lt;/code&gt; e &lt;code&gt;.slnx&lt;/code&gt; no mesmo repositório&lt;/strong&gt; para evitar confusão e conflitos de ferramentas.&lt;br&gt;
✔️ Algumas IDEs ou extensões antigas podem ainda não ter suporte completo ao novo formato, exigindo atualizações.&lt;br&gt;
✔️ Em casos específicos (Unity/VS Code), pode ser necessário garantir que a versão do SDK suporte &lt;code&gt;.slnx&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Conclusão
&lt;/h2&gt;

&lt;p&gt;O novo formato &lt;code&gt;.slnx&lt;/code&gt; representa uma evolução importante no fluxo de desenvolvimento .NET — &lt;strong&gt;tornando os arquivos de solução mais simples, legíveis e amigáveis&lt;/strong&gt; para times modernos e pipelines de CI/CD.&lt;/p&gt;

&lt;p&gt;Embora o formato &lt;code&gt;.sln&lt;/code&gt; ainda seja amplamente compatível, o &lt;code&gt;.slnx&lt;/code&gt; já é o &lt;strong&gt;padrão a partir do .NET 10&lt;/strong&gt;, simplificando o gerenciamento de projetos e reduzindo tópicos recorrentes como conflitos no Git e dificuldade de edição.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://dev.to/daniloopinheiro"&gt;Dev.to&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://daniloopinheiro.medium.com/" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📬 &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;daniloopinheiro&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¹⁴ E disse ele: Não, mas venho agora como príncipe do exército do Senhor. Então Josué se prostrou com o seu rosto em terra e o adorou, e disse-lhe: Que diz meu Senhor ao seu servo? Josué 5:14&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>🧾 Console.Write(): Explorando todas as possibilidades!</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Fri, 26 Dec 2025 20:33:33 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/consolewrite-explorando-todas-as-possibilidades-8im</link>
      <guid>https://dev.to/daniloopinheiro/consolewrite-explorando-todas-as-possibilidades-8im</guid>
      <description>&lt;h2&gt;
  
  
  Do C# 1.0 ao C# 13
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Diferente do &lt;code&gt;Console.WriteLine()&lt;/code&gt;, o método &lt;code&gt;Console.Write()&lt;/code&gt; &lt;strong&gt;não quebra a linha&lt;/strong&gt; após a escrita.&lt;br&gt;
Ele é muito usado para &lt;strong&gt;saídas contínuas&lt;/strong&gt;, &lt;strong&gt;progresso em tempo real&lt;/strong&gt;, &lt;strong&gt;logs formatados&lt;/strong&gt; e &lt;strong&gt;interfaces de console interativas&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧱 C# 1.0 (2002) – Forma Clássica
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;ConsoleApp&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"World "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C# 1.0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello World C# 1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 C# 2.0 (2005)
&lt;/h2&gt;

&lt;p&gt;Sem mudanças diretas na API do &lt;code&gt;Console&lt;/code&gt;, mas o padrão permanece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World - C# 2.0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 C# 3.0 (2007) – &lt;code&gt;var&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World - C# 3.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 Código mais limpo com inferência de tipo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 C# 4.0 (2010) – &lt;code&gt;dynamic&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World - C# 4.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Uso possível, mas não recomendado para cenários simples.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ C# 5.0 (2012) – Assíncrono (Simulação)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Threading.Tasks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Loading"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loading...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ C# 6.0 (2015) – Interpolação de Strings
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"C# 6.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Hello World - &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 C# 7.x (2017–2018) – Tuplas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"C#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"7.x"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 C# 8.0 (2019) – Nullable Reference Types
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World - C# 8.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="s"&gt;"Mensagem padrão"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛡️ Proteção contra &lt;code&gt;NullReferenceException&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 C# 9.0 (2020) – Top-Level Statements
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World - C# 9.0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔥 Código direto, sem &lt;code&gt;Program.cs&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 C# 10.0 (2021) – Global Usings
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World - C# 10.0"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📉 Menos boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧬 C# 11.0 (2022) – Raw String Literals
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"""
&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="m"&gt;11.0&lt;/span&gt;
&lt;span class="n"&gt;Sem&lt;/span&gt; &lt;span class="n"&gt;quebra&lt;/span&gt; &lt;span class="n"&gt;autom&lt;/span&gt;&lt;span class="err"&gt;á&lt;/span&gt;&lt;span class="n"&gt;tica&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt;
&lt;span class="s"&gt;""");
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 C# 12.0 (2023) – Collection Expressions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"C# 12.0"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello World C# 12.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 C# 13.0 (Preview / 2025)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World - C# 13.0 (Preview)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔮 Evolução focada em imutabilidade e padrões.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Console.Write vs Console.WriteLine
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método&lt;/th&gt;
&lt;th&gt;Comportamento&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Console.Write()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Continua na mesma linha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Console.WriteLine()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quebra linha automaticamente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ Casos de Uso Comuns do &lt;code&gt;Console.Write()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;✔️ Barras de progresso&lt;br&gt;
✔️ Logs contínuos&lt;br&gt;
✔️ CLI interativas&lt;br&gt;
✔️ Animações simples no terminal&lt;/p&gt;

&lt;p&gt;Exemplo de progresso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"\rProgresso: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;Mesmo sendo simples, o &lt;code&gt;Console.Write()&lt;/code&gt; acompanhou toda a evolução do C#.&lt;br&gt;
A diferença está &lt;strong&gt;na forma como escrevemos código hoje&lt;/strong&gt; — mais limpo, expressivo e seguro — não no método em si.&lt;/p&gt;

&lt;p&gt;Dominar esses detalhes é essencial para escrever &lt;strong&gt;ferramentas CLI modernas&lt;/strong&gt;, &lt;strong&gt;scripts&lt;/strong&gt;, &lt;strong&gt;workers&lt;/strong&gt; e &lt;strong&gt;ferramentas DevOps em .NET&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://dev.to/daniloopinheiro"&gt;Medium&lt;/a&gt;&lt;br&gt;
📬 &lt;a href="mailto:daniloopinheiro@dopme.io"&gt;daniloopinheiro&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Porque a minha mão fez todas estas coisas, e assim todas elas foram feitas, diz o Senhor; mas para esse olharei, para o pobre e abatido de espírito, e que treme da minha palavra. &lt;br&gt;
Isaías 66:2&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>dotnetcore</category>
    </item>
    <item>
      <title>🛠️ O que chegou de novo no Visual Studio 2026 Insiders</title>
      <dc:creator>Danilo O. Pinheiro, dopme.io</dc:creator>
      <pubDate>Thu, 30 Oct 2025 19:10:32 +0000</pubDate>
      <link>https://dev.to/daniloopinheiro/o-que-chegou-de-novo-no-visual-studio-2026-insiders-15dp</link>
      <guid>https://dev.to/daniloopinheiro/o-que-chegou-de-novo-no-visual-studio-2026-insiders-15dp</guid>
      <description>&lt;h1&gt;
  
  
  📝 Introdução
&lt;/h1&gt;

&lt;p&gt;A Microsoft lançou recentemente o Visual Studio 2026 na versão Insiders, uma prévia que inaugura o que será o futuro da IDE para desenvolvedores em .NET, C#, C++ e workloads que envolvem nuvem, IA e grandes soluções corporativas. ([Microsoft for Developers][1])&lt;br&gt;
Neste artigo, vamos explorar os &lt;strong&gt;principais destaques&lt;/strong&gt;, mostrar como a experiência foi evoluída e o que isso significa para quem desenvolve em .NET moderno.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Novos Destaques Principais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🤖 Integração profunda com IA
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A integração do GitHub Copilot foi ampliada na IDE para ações como &lt;strong&gt;Adaptive Paste&lt;/strong&gt;, onde o código colado é adaptado automaticamente ao contexto do arquivo. ([Microsoft Learn][2])&lt;/li&gt;
&lt;li&gt;A pesquisa “Você quis dizer?” (“Did you mean?”) foi adicionada para melhorar a busca dentro do IDE com sugestões baseadas em IA. ([Microsoft Learn][2])&lt;/li&gt;
&lt;li&gt;Um agente de profiler com suporte de IA pode sugerir melhorias de desempenho e alocação de memória. ([Visual Studio Magazine][3])&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Performance e produtividade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O VS2026 Insiders promete solução de carregamento e ciclos de build/debug até &lt;strong&gt;30 % mais rápidos&lt;/strong&gt; em comparação com versões anteriores. ([Microsoft Learn][2])&lt;/li&gt;
&lt;li&gt;Suporte otimizado para hardware moderno, tanto em x64 quanto em ARM64. ([c-sharpcorner.com][4])&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎨 Interface modernizada
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nova interface baseada em “Fluent UI”, com maior clareza, novos ícones, melhorias de acessibilidade e &lt;strong&gt;11 novos temas&lt;/strong&gt; para personalização. ([Visual Studio Magazine][3])&lt;/li&gt;
&lt;li&gt;Instalação lado-a-lado com versões anteriores (ex: VS2022), com compatibilidade de extensões e importação de configurações. ([Visual Studio][5])&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Suporte a linguagens e plataformas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Suporte completo para .NET 10 e C# 14: novos recursos de linguagem, compilador atualizado, melhor IntelliSense. ([Visual Studio Magazine][3])&lt;/li&gt;
&lt;li&gt;Suporte avançado para projetos C++ e workloads de jogo, nuvem, IA. ([Visual Studio][5])&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📋 Principais Melhorias Organizacionais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O canal “Insiders” substitui o antigo “Preview” para acesso antecipado a novas funcionalidades. ([Microsoft for Developers][1])&lt;/li&gt;
&lt;li&gt;Compatibilidade de extensões: as extensões feitas para VS2022 funcionam no VS2026 Insiders desde o primeiro dia. ([Visual Studio][5])&lt;/li&gt;
&lt;li&gt;Ferramentas de cobertura de código disponíveis também para edições Community e Professional – antes restritas a versões Enterprise. ([Microsoft Learn][2])&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Impacto para Desenvolvedores .NET
&lt;/h2&gt;

&lt;p&gt;Para quem trabalha com .NET moderno, essa atualização traz vantagens práticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao usar .NET 10 e C# 14, você já estará na vanguarda, o que pode evitar “lock-in” em versões antigas.&lt;/li&gt;
&lt;li&gt;A integração de IA acelera tarefas repetitivas (refatoração, comentários, adaptação de código) e permite focar em lógica de negócios.&lt;/li&gt;
&lt;li&gt;Melhor desempenho da IDE significa mais tempo codificando, menos tempo esperando builds ou debugging.&lt;/li&gt;
&lt;li&gt;A customização visual e de experiência ajuda a manter foco e reduzir fadiga em ambientes de longo trabalho.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;O Visual Studio 2026 Insiders representa mais do que uma simples atualização: é um passo estratégico rumo às ferramentas de desenvolvimento que combinam IA, performance e design moderno. Embora ainda seja uma versão prévia (Insiders), vale para experimentação.&lt;br&gt;
Se você desenvolve em .NET, vale testar, avaliar a compatibilidade com seus projetos e começar a se preparar para a migração.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Conecte-se Comigo
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com .NET moderno e quer dominar arquitetura, C#, DevOps ou interoperabilidade, vamos conversar:&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/in/daniloopinheiro" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
✍️ &lt;a href="https://medium.com/@daniloopinheiro" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
📬 &lt;a href="mailto:contato@dopme.io"&gt;dopme.io&lt;/a&gt;&lt;br&gt;
📬 &lt;a href="mailto:devsfree@devsfree.com.br"&gt;devsfree&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;⁵ Porque na morte não há lembrança de ti; no sepulcro quem te louvará?  Salmos 6:5&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>dotnet</category>
      <category>vscode</category>
      <category>visualstudio</category>
    </item>
  </channel>
</rss>
