<?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: Thaylon Lopes</title>
    <description>The latest articles on DEV Community by Thaylon Lopes (@thaylon_lopes).</description>
    <link>https://dev.to/thaylon_lopes</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%2F4242954%2Fca3045e1-f523-49c2-825d-841b8b30c528.jpg</url>
      <title>DEV Community: Thaylon Lopes</title>
      <link>https://dev.to/thaylon_lopes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thaylon_lopes"/>
    <language>en</language>
    <item>
      <title>Todo projeto .NET tem a mesma pasta "Utils". Aqui está uma proposta para mudá-la.</title>
      <dc:creator>Thaylon Lopes</dc:creator>
      <pubDate>Fri, 13 Nov 2026 12:53:04 +0000</pubDate>
      <link>https://dev.to/thaylon_lopes/todo-projeto-net-tem-a-mesma-pasta-utils-aqui-esta-uma-proposta-para-muda-la-2eg8</link>
      <guid>https://dev.to/thaylon_lopes/todo-projeto-net-tem-a-mesma-pasta-utils-aqui-esta-uma-proposta-para-muda-la-2eg8</guid>
      <description>&lt;p&gt;&lt;em&gt;Uma jornada prática de estudos que transformou rotinas utilitárias do dia a dia em micro-pacotes com testes unitários e benchmarks, culminando em bibliotecas desacopladas e templates para o ecossistema .NET.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Todo desenvolvedor .NET com alguns anos de estrada já viveu exatamente esta cena:&lt;/p&gt;

&lt;p&gt;Você cria uma nova API ou microsserviço e, na primeira hora de trabalho — antes mesmo de escrever a primeira regra de negócio —, abre o Google, o StackOverflow ou um projeto antigo no GitHub para pescar código utilitário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aquele método para ler a &lt;code&gt;[Description]&lt;/code&gt; de um Enum;&lt;/li&gt;
&lt;li&gt;A formatação e validação de datas comerciais ou fusos UTC;&lt;/li&gt;
&lt;li&gt;O algoritmo de paginação Keyset no EF Core;&lt;/li&gt;
&lt;li&gt;A lógica para mascarar dados sensíveis (LGPD) ou extrair claims de um token JWT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A gente joga tudo isso dentro de uma pasta chamada &lt;code&gt;Utils&lt;/code&gt;, &lt;code&gt;Common&lt;/code&gt; ou &lt;code&gt;Shared&lt;/code&gt;, promete para si mesmo que &lt;em&gt;"dessa vez vai ser organizado e temporário"&lt;/em&gt; e segue o jogo.&lt;/p&gt;

&lt;p&gt;O problema é o tempo. Seis meses e quatro microsserviços depois, aquela pasta &lt;code&gt;Utils&lt;/code&gt; já possui versões divergentes espalhadas pela empresa. Um bug corrigido no serviço de Pagamentos continua vivo no serviço de Faturamento. E o pior de tudo: &lt;strong&gt;quase ninguém escreve testes unitários ou mede o custo de alocação de memória de um código que foi apenas copiado e colado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu me cansei desse retrabalho. O que começou despretensiosamente como uma forma de estudo nos tempos livres e a vontade de &lt;em&gt;"organizar rotinas comuns em pacotes leves e testados"&lt;/em&gt; acabou evoluindo de forma consistente: hoje são &lt;strong&gt;32 pacotes publicados no NuGet&lt;/strong&gt;, somando mais de &lt;strong&gt;35.000 downloads&lt;/strong&gt;, com baterias completas no &lt;strong&gt;BenchmarkDotNet&lt;/strong&gt; e &lt;strong&gt;dois templates arquiteturais oficiais&lt;/strong&gt; (&lt;code&gt;TL.LiteCore&lt;/code&gt; e &lt;code&gt;TL.ResilientCore&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Neste primeiro artigo da série, quero abrir os bastidores reais dessa jornada: o estudo prático nos tempos livres, a obsessão por zero dependências externas, os números reais de performance e o porquê de criar dois templates cirúrgicos para resolver o "Day 0".&lt;/p&gt;




&lt;h2&gt;
  
  
  1. O Ponto de Partida: Curiosidade Técnica e Eliminação do Retrabalho
&lt;/h2&gt;

&lt;p&gt;No início, eu não tinha a pretensão de lançar um ecossistema. O objetivo era muito mais modesto: &lt;strong&gt;estudar a fundo as entranhas do C# e do runtime .NET&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu queria pegar aquelas rotinas que usamos de olhos fechados no dia a dia e submetê-las a duas perguntas incômodas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Esse código está realmente protegido por testes para cenários de borda?&lt;/strong&gt; (Strings nulas, formatos inesperados, concorrência, fusos horários atípicos).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qual é o custo real dessa abstração em CPU e alocações no Heap (Garbage Collector)?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conforme me deparava com rotinas repetitivas nos projetos do dia a dia, passei a isolá-las e organizá-las em soluções dedicadas. O que no início eram métodos soltos evoluiu organicamente para uma suíte de extensões puras (&lt;code&gt;TL.*ExtensionsLibrary&lt;/code&gt;), aceleradores de dados (&lt;code&gt;TL.DataHelpers&lt;/code&gt;), blocos de resiliência e contratos fundamentais (&lt;code&gt;TL.BuildingBlocks&lt;/code&gt;) e barramento de mensageria (&lt;code&gt;TL.Messaging&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Para manter esse ecossistema organizado, versionado e de fácil consumo entre diferentes soluções, passei a empacotar e publicar tudo abertamente no &lt;a href="https://www.nuget.org/profiles/ThaylonMALopes" rel="noopener noreferrer"&gt;NuGet Gallery (&lt;code&gt;ThaylonMALopes&lt;/code&gt;)&lt;/a&gt;. Com a evolução contínua das versões, testes e integrações, o perfil hoje reúne um histórico consolidado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────────────┐
│                        NUGET GALLERY HIGHLIGHTS                        │
│                                                                        │
│   📦 Total de Pacotes Públicos:   32 pacotes                           │
│   🚀 Total Acumulado de Downloads: +35.070 downloads                   │
│                                                                        │
│   • TL.EnumExtensionsLibrary       ➔  2.450+ downloads (v0.8.0)        │
│   • TL.NumericExtensionsLibrary    ➔  2.120+ downloads (v0.8.0)        │
│   • TL.CollectionExtensionsLibrary ➔  2.120+ downloads (v0.8.0)        │
│   • TL.ObjectExtensionsLibrary     ➔  1.800+ downloads (v0.8.0)        │
└────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. A Regra de Ouro: "Zero Dependências Externas" (Pureza BCL)
&lt;/h2&gt;

&lt;p&gt;Quando você decide criar bibliotecas utilitárias, a primeira tentação comum é baixar pacotes populares de terceiros para resolver problemas corriqueiros. Mas isso traz armadilhas severas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependências transitivas desnecessárias:&lt;/strong&gt; Para usar um método simples, seu projeto arrasta 15 DLLs que você nem conhece.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risco de Supply Chain:&lt;/strong&gt; Quanto maior a árvore de pacotes de terceiros, maior a superfície para vulnerabilidades e quebras de compatibilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mudança de Licenciamento:&lt;/strong&gt; Como vimos recentemente no ecossistema .NET, bibliotecas consagradas que eram gratuitas mudaram de licença comercial. Ficar refém de dependências externas para mecânicas básicas é um risco de negócio real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para as bibliotecas de extensão e contratos (&lt;code&gt;TL.*ExtensionsLibrary&lt;/code&gt; e &lt;code&gt;TL.BaseContracts&lt;/code&gt;), a diretriz foi inegociável: &lt;strong&gt;zero dependências externas e pureza de BCL&lt;/strong&gt;. Se o runtime moderno do C# e do .NET 8/9 oferece &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;ArrayPool&amp;lt;T&amp;gt;&lt;/code&gt; e &lt;code&gt;System.Text.Json&lt;/code&gt; com alta eficiência, não há motivo para inflar essas bases com pacotes de terceiros. Já para os pacotes de integração e infraestrutura (como RabbitMQ, Dapper e Mongo), o foco foi criar adaptadores finos e resilientes, sem arrastar dezenas de DLLs indiretas para o projeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. O Choque dos Benchmarks: A Memória Oculta do "Copia e Cola"
&lt;/h2&gt;

&lt;p&gt;Ao isolar os métodos e submetê-los ao &lt;strong&gt;BenchmarkDotNet&lt;/strong&gt;, a teoria deu lugar aos fatos empíricos. Muitos códigos "clássicos" copiados de fóruns são verdadeiros vilões de alocação no Heap, sobrecarregando o Garbage Collector (GC).&lt;/p&gt;

&lt;p&gt;Veja dois testes reais executados no ecossistema:&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso 1: Lendo Descrições de Enums (&lt;code&gt;TL.EnumExtensionsLibrary&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;O método tradicional em quase toda empresa usa reflexão pura direta no Enum (&lt;code&gt;field.GetCustomAttributes(...)&lt;/code&gt;) a cada requisição. No &lt;code&gt;TL.EnumExtensionsLibrary&lt;/code&gt;, implementamos um cache genérico de thread-safe zero-alloc:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abordagem&lt;/th&gt;
&lt;th&gt;Tempo Médio&lt;/th&gt;
&lt;th&gt;Memória Alocada (Heap)&lt;/th&gt;
&lt;th&gt;Razão de Alocação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reflection Direta (Baseline habitual)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;263.6 μs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.560 Bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;TL.EnumExtensionsLibrary&lt;/code&gt; (Generic Cache)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;274.1 μs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400 Bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.26 (-74%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ganho Real:&lt;/strong&gt; &lt;strong&gt;74% a menos de alocação no Heap&lt;/strong&gt;. Em cenários de alto throughput com muitas requisições por segundo, essa redução contínua de alocações diminui sensivelmente o trabalho de coleta e a pressão sobre o Garbage Collector (GC).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Caso 2: Ordenação Dinâmica no LINQ (&lt;code&gt;TL.QueryableExtensionsLibrary&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Endpoints com filtros e ordenação dinâmica em tempo de execução (&lt;code&gt;?sortBy=CreatedAt&amp;amp;desc=true&lt;/code&gt;) costumam recorrer a reflexão sem cache para montar expressões dinâmicas. Ao comparar a reflexão tradicional com a compilação e cache de Expression Trees da biblioteca:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abordagem&lt;/th&gt;
&lt;th&gt;Tempo Médio&lt;/th&gt;
&lt;th&gt;Memória Alocada (Heap)&lt;/th&gt;
&lt;th&gt;Impacto Real&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reflection sem Cache (Baseline tradicional)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11.98 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;445.99 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alocação excessiva no Heap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;TL.QueryableExtensionsLibrary&lt;/code&gt; (Cached Expressions)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.83 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;212.39 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-52,4% de memória alocada&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Medir esses números provou que código utilitário não é "código secundário". Como essas rotinas rodam no alicerce de praticamente todas as requisições, qualquer otimização de alocação acumula ganhos consistentes ao longo do ciclo de vida da aplicação.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. O Dilema do "Day 0": Do Pacote Avulso aos Templates CLI
&lt;/h2&gt;

&lt;p&gt;Depois de consolidar e publicar as bibliotecas, esbarrei no próximo atrito da rotina de desenvolvimento:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Ter ótimas bibliotecas no NuGet resolve o código compartilhado, mas não elimina o trabalho de setup inicial: a cada novo serviço, ainda era necessário recriar a estrutura de pastas, configurar injeção de dependência, Docker Chiseled, probes de HealthCheck e padronizar OpenAPI."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Era hora de automatizar o "Day 0" com &lt;strong&gt;Templates CLI (&lt;code&gt;dotnet new&lt;/code&gt;)&lt;/strong&gt;. Mas aqui mora um dos maiores erros da arquitetura: &lt;strong&gt;tentar criar um único template que sirva para tudo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se você escolhe uma estrutura com DDD completo, CQRS, RabbitMQ e Outbox Pattern para criar uma API simples de consulta de CEP ou um webhook satélite, você gera &lt;strong&gt;sobre-engenharia (overengineering)&lt;/strong&gt; e infla o consumo de nuvem sem necessidade. &lt;/p&gt;

&lt;p&gt;Por outro lado, se cria uma API rasa e sem isolamento para um core financeiro ou de pedidos, o projeto logo se torna insustentável.&lt;/p&gt;

&lt;p&gt;Por isso, dividi a estratégia em &lt;strong&gt;dois templates complementares&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;┌────────────────────────────────────────────────────────────────────────┐
│                      MATRIZ COMPARATIVA DE TEMPLATES                   │
├────────────────────────────┬─────────────────────┬─────────────────────┤
│ Dimensão                   │ ⚡ TL.LiteCore      │ 🛡️ TL.ResilientCore │
├────────────────────────────┼─────────────────────┼─────────────────────┤
│ Paradigma                  │ Minimal APIs REST   │ Event-Driven &amp;amp; CQRS │
│ Modelo Transacional        │ ACID Local direto   │ Transactional Outbox│
│ Mensageria Interna         │ Nenhuma (Bloqueada) │ RabbitMQ + DLQ      │
│ Banco Local em Dev         │ SQLite em memória   │ Postgres 16 (Docker)│
│ Consumo de RAM             │ ~35 MB              │ 120 MB a 180 MB     │
│ Tempo de Startup (Boot)    │ &amp;lt; 80 ms             │ 350 ms a 600 ms     │
│ Tamanho do Container       │ &amp;lt; 110 MB (Chiseled) │ ~210 MB (Chiseled)  │
│ Rastreabilidade            │ Logs estruturados   │ W3C Tracing nativo  │
│ Cenário Recomendado        │ CRUDs, BFFs, PoCs   │ Sistemas Críticos   │
└────────────────────────────┴─────────────────────┴─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. &lt;code&gt;TL.LiteCore&lt;/code&gt; (&lt;code&gt;dotnet new tl-litecore&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Focado em &lt;strong&gt;alta densidade, baixo custo (FinOps) e startup ultrarrápido (&amp;lt;80ms)&lt;/strong&gt;. Ele é um &lt;em&gt;Clean Skeleton&lt;/em&gt; (sem entidades falsas para apagar). Já vem com Result Pattern embutido via &lt;code&gt;TL.BaseContracts&lt;/code&gt;, documentação Scalar OpenAPI e testes funcionais em memória com &lt;code&gt;WebApplicationFactory&lt;/code&gt;. Consumindo em torno de ~35MB de RAM em repouso, o template oferece uma excelente densidade de recursos (FinOps), ideal para cenários com múltiplos microsserviços satélites ou modelos de escala a zero.&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="c"&gt;# Instalar e criar uma Minimal API síncrona pronta em 30 segundos&lt;/span&gt;
dotnet new install TL.LiteCore.Template
dotnet new tl-litecore -n MinhaOrganizacao.CatalogoApi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;code&gt;TL.ResilientCore&lt;/code&gt; (&lt;code&gt;dotnet new tl-resilientcore&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Desenhado para o coração do negócio. Já nasce com &lt;strong&gt;Transactional Outbox Pattern&lt;/strong&gt; (mensagens só saem no RabbitMQ se o banco commitar), &lt;strong&gt;Transactional Inbox&lt;/strong&gt; (garantia de consumo idempotente), políticas de resiliência compostas pelo Polly v8 e rastreamento distribuído ponta a ponta (&lt;code&gt;traceparent&lt;/code&gt; W3C).&lt;/p&gt;

&lt;p&gt;O grande trunfo é a &lt;strong&gt;consistência de engenharia&lt;/strong&gt;: o desenvolvedor usa os mesmos contratos, as mesmas extensões e o mesmo tratamento de erros tanto no serviço de 35MB quanto no serviço core orientado a eventos.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. O Real Valor Entregue: Por que tudo isso valeu a pena?
&lt;/h2&gt;

&lt;p&gt;Ao olhar para essa jornada, o valor real entregue não é medido apenas pelas linhas de código escritas, mas pelo impacto prático:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Aceleração do Day 0:&lt;/strong&gt; Todo o trabalho repetitivo de setup inicial de infraestrutura, arquitetura e testes é resolvido em um único comando CLI, entregando uma solução pronta e com testes verdes de primeira.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padronização e Reuso:&lt;/strong&gt; Elimina as versões divergentes de helpers de data, paginação e claims que costumam se proliferar entre projetos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FinOps &amp;amp; Densidade Computacional:&lt;/strong&gt; APIs leves permitem escala a zero eficiente e menor custo na nuvem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resiliência Transacional sem Licenças Caras:&lt;/strong&gt; Solução robusta de Outbox e Inbox no RabbitMQ sem amarras proprietárias.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🗺️ O Que Vem Pela Frente
&lt;/h2&gt;

&lt;p&gt;Este é o primeiro artigo de uma série técnica onde pretendo abrir o código, a arquitetura interna e os benchmarks de cada um desses componentes. Alguns dos tópicos que quero explorar em profundidade nos próximos textos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Result Pattern vs Exceções:&lt;/strong&gt; O benchmark definitivo medindo a diferença de latência e alocação de memória no fluxo de negócio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Técnicas de Zero-Allocation no C#:&lt;/strong&gt; Uso prático de &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt; e &lt;code&gt;ArrayPool&amp;lt;T&amp;gt;&lt;/code&gt; para processamento de alto rendimento sem sobrecarregar o Garbage Collector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyset Pagination na Prática:&lt;/strong&gt; Como estruturar consultas com cursores para paginar milhões de registros em $O(1)$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resiliência e Mensageria Defensiva:&lt;/strong&gt; Implementando Transactional Outbox, Dead Letter Queues (DLQ) e consumo idempotente com RabbitMQ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TL.LiteCore vs TL.ResilientCore:&lt;/strong&gt; Um guia arquitetural aprofundado para orientar a escolha do template ideal para o perfil do seu serviço.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conheça e Teste o Ecossistema
&lt;/h2&gt;

&lt;p&gt;Todos os pacotes estão disponíveis publicamente no NuGet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Perfil no NuGet Gallery:&lt;/strong&gt; &lt;a href="https://www.nuget.org/profiles/ThaylonMALopes" rel="noopener noreferrer"&gt;nuget.org/profiles/ThaylonMALopes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Repositórios e Código Aberto:&lt;/strong&gt; &lt;a href="https://github.com/thaylonlopes" rel="noopener noreferrer"&gt;github.com/thaylonlopes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;E no seu time? Como vocês lidam com a tentação da pasta "Utils" e a padronização no início de novos microsserviços? Compartilhe sua experiência nos comentários!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>dotnet</category>
      <category>nuget</category>
      <category>cleancode</category>
    </item>
  </channel>
</rss>
