Conceitos da plataforma .NET e de arquitetura de aplicações explicados a fundo, um de cada vez.
O que o container faz, transient, scoped e singleton, por que o DbContext é scoped, captive dependencies, criar um escopo à mão e keyed services.
Fontes de configuração e sua precedência, override por ambiente sem tocar no código, settings tipados com ValidateOnStart e como manter segredos fora do repositório.
Como uma URL vira uma chamada de handler (templates e binding), rotas nomeadas com CreatedAtRoute, route groups e como tirar os endpoints do Program.cs.
O verbo, a URI e o status code como contrato HTTP, quais métodos são seguros ou idempotentes, 404 honesto, DELETE idempotente, TypedResults e ProblemDetails.
Por que uma API REST não deve serializar entidades, um DTO por caso de uso com records C#, onde mora o mapeamento e a projeção direto na query.
Data annotations com AddValidation (.NET 10), a resposta 400 com erros por campo, a armadilha de tipos não descobertos e o que anotações não conseguem expressar.
Um caminho concreto, em passos pequenos, de uma API CRUD de um projeto só para dois módulos (Catalog e Orders) com projetos, schemas e um contrato entre eles.
Projetos, visibilidade internal e um projeto de contratos por módulo como fronteira que o compilador do .NET garante, com um schema e um DbContext por módulo.
Consultas síncronas via contratos, eventos de integração com outbox para entrega confiável, e testes de arquitetura que transformam as regras de dependência em build quebrado.
Hospedar um único módulo com banco real, trocar os outros módulos por fakes dos contratos, testar eventos sem sleep e manter poucos testes da aplicação completa.
Records como value objects, IDs fortemente tipados, aggregate root que protege as invariantes e coleções encapsuladas, com o custo de cada escolha.
Owned types vs complex types, value converters, construtor privado e backing fields, e quando usar um repository em vez do DbContext direto.
Eventos levantados pelo aggregate, despachados por um interceptor do SaveChanges, a diferença para integration events e a regra de um aggregate por transação.
Modelo, DbContext e registro com SQLite, Add versus SaveChanges, FindAsync e projeção, update e delete em massa, e seeding de dados de referência com UseSeeding e HasData.
Um contexto por unidade de trabalho, pooling e IDbContextFactory, os estados das entidades no change tracker e quando usar AsNoTracking.
A transação implícita do SaveChanges, concurrency tokens (rowversion e xmin), DbUpdateConcurrencyException e a retry strategy junto com transação manual.
Include e ThenInclude, explosão cartesiana e AsSplitQuery, N+1 com lazy loading, projeções e como ler o SQL gerado com ToQueryString.
Onde a tradução LINQ para SQL para, compiled queries, ExecuteUpdate e ExecuteDelete, FromSql vs FromSqlRaw e paginação por keyset.
Model snapshot, revisão do SQL gerado (rename que vira drop + add), migrationBuilder.Sql, conflito de snapshot entre branches e checagem do modelo no CI.
Riscos do Migrate() no startup com várias réplicas, scripts idempotentes, migration bundles, expand/contract e índices concorrentes no PostgreSQL.
IHostedService vs BackgroundService, exceção que derruba o host, IServiceScopeFactory dentro de singleton, PeriodicTimer e graceful shutdown.
Channel<T> bounded, BoundedChannelFullMode, producer no endpoint e consumer no BackgroundService, drenagem no shutdown e o que se perde num restart.
Por que uma fila em memória não basta, Hangfire vs Quartz.NET, retries, recurring jobs, idempotência por causa da entrega at-least-once e passar IDs em vez de entidades.
A state machine gerada pelo compilador, SynchronizationContext e ConfigureAwait, deadlock com .Result, async void, as regras do ValueTask e por que Task.Run não torna I/O assíncrono.
Cancelamento e timeouts, throttling com SemaphoreSlim, fan-out e fan-in com Channels, TaskCompletionSource e as armadilhas do ConcurrentDictionary.GetOrAdd.
CPU-bound vs I/O-bound, Parallel.For e ForEachAsync, PLINQ, agregação sem lock com localInit e localFinally, e quando o paralelo fica mais lento.