Dotnetcore: Referência Completa

O .NET Core é o runtime multiplataforma e open-source da Microsoft para construir APIs web, serviços em background e aplicativos de console. Esta referência cobre os padrões que aparecem em aplicações reais de produção.

TL;DR: Uma referência .NET Core cobrindo APIs web, injeção de dependências, Entity Framework Core, autenticação com JWT e deploy no Azure.
Stack: .NET Core, C#, ASP.NET Core, Entity Framework Core
Nível: Intermediário
Tempo de leitura: ~30 min

Criar projeto e roteamento básico

dotnet new web

// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Olá Mundo");
app.MapGet("/produto/{id}", ([FromRoute] int id) => Results.Ok(id));
app.MapPost("/produto", (Product p) => Results.Created($"/produto/{p.Id}", p));

app.Run();

Configuração

// appsettings.json
{
  "Database": {
    "Connection": "Server=localhost;Database=Products;User Id=sa;Password=suaSenha"
  }
}

// Lendo no código
var conn = builder.Configuration["Database:Connection"];

Entity Framework Core

dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design

// DbContext
public class ApplicationDbContext : DbContext {
    public DbSet<Product> Products { get; set; }
    
    protected override void OnConfiguring(DbContextOptionsBuilder options) {
        options.UseSqlServer("sua-connection-string");
    }
    
    protected override void OnModelCreating(ModelBuilder builder) {
        builder.Entity<Product>().Property(p => p.Name).HasMaxLength(500);
    }
}

builder.Services.AddDbContext<ApplicationDbContext>();

Migrations

dotnet tool install --global dotnet-ef
dotnet ef migrations add CriacaoInicial
dotnet ef database update

# Reverter para migration específica
dotnet ef database update NomeDaMigration

Autenticação JWT

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore

// Setup no Program.cs
builder.Services.AddAuthentication(x => {
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
    options.TokenValidationParameters = new TokenValidationParameters() {
        ValidateAudience = true,
        ValidateIssuer = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = builder.Configuration["JwtSettings:Issuer"],
        ValidAudience = builder.Configuration["JwtSettings:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(builder.Configuration["JwtSettings:SecretKey"]))
    };
});

Dapper para consultas avançadas

dotnet add package Dapper

var db = new SqlConnection(configuration["Database:Connection"]);
var usuarios = db.Query<UserResponse>(
    "SELECT Email, Name FROM Users ORDER BY Name OFFSET (@page-1)*@rows ROWS FETCH NEXT @rows ROWS ONLY",
    new { page, rows }
);

Azure Functions

Azure Functions são recursos serverless no Azure que podem ser disparados por requisições HTTP, timers, filas e Event Grid. Importante: por padrão, todos os recursos do Azure usam timezone UTC. Para o Brasil, adicione WEBSITE_TIME_ZONE = “E. South America Standard Time” na configuração do function app para evitar timestamps 3 horas adiantados.

O que você tem

Uma referência .NET Core cobrindo a stack completa: configuração de API web com minimal API, acesso ao banco com Entity Framework Core, migrations, autenticação JWT com Identity e Dapper para consultas complexas.

Próximos passos

  • Use o container de injeção de dependências embutido desde o início. Injeção via construtor mantém o código testável e evita estado global.
  • Commit as migrations do EF Core no controle de versão e nunca modifique o banco de produção manualmente.
  • Use IOptions para binding de configuração em classes fortemente tipadas, em vez de ler IConfiguration diretamente fora do código de inicialização.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário