Program.cs — WebApplication.CreateBuilder, middleware pipeline

~20 daq · .NET Backend · ASP.NET Core — Kirish

Muammodan boshlaylik

36-darsdagi loyihada Program.cs — 20 qatorcha kod. Har bir qator nima qiladi? Nega AddControllers bir joyda, MapControllers boshqa joyda? Yangi servis yoki CORS qo'shish uchun qayerga yozish kerak? Va nega qatorlar tartibini almashtirsangiz — autentifikatsiya ishlamay qoladi?


Umumiy tuzilma

var builder = WebApplication.CreateBuilder(args);

// ─── 1. SERVISLAR (DI konteyner) ───
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// ─── 2. MIDDLEWARE PIPELINE ───
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();

// ─── 3. ENDPOINT LAR ───
app.MapControllers();

// ─── 4. ISHGA TUSHIRISH ───
app.Run();

To'rt bosqich:

Bosqich Nima Qayerda
1. Servislar Ilova nimalardan foydalanadi builder.Services.AddXxx()
2. Middleware So'rov qanday qayta ishlanadi app.UseXxx()
3. Endpoint lar So'rov qayerga boradi app.MapXxx()
4. Ishga tushirish Serverni boshlash app.Run()

[!INFO] .NET 6 dan oldin bu ikki faylga bo'lingan edi: Program.cs va Startup.cs (ConfigureServices va Configure metodlari bilan). Eski maqolalarda shuni ko'rsangiz — g'oya bir xil, faqat yozilishi boshqacha.


Hayotiy o'xshatma

Restoran ochilishi. Avval xodimlar va jihozlar yollanadi (servislar ro'yxati). Keyin mehmon kirgandan stolgacha bo'lgan tartib belgilanadi: qo'riqchi → garderob → administrator → ofitsiant (middleware pipeline). Menyu tuziladi (endpoint lar). Va eshik ochiladi (Run).


WebApplication.CreateBuilder

var builder = WebApplication.CreateBuilder(args);

Bu bitta qator ko'p narsani sozlaydi:

  • Konfiguratsiya — appsettings.json, appsettings.{Environment}.json, environment o'zgaruvchilari, buyruq qatori argumentlari, User Secrets (40-dars)
  • Logging — konsol va debug log
  • Kestrel — veb-server
  • DI konteyner — builder.Services
  • Muhit — builder.Environment (Development, Staging, Production)
var connStr = builder.Configuration.GetConnectionString("Default");
bool dev = builder.Environment.IsDevelopment();

1. Servislar — builder.Services

builder.Services.AddControllers();
builder.Services.AddDbContext<DokonDbContext>(o => o.UseNpgsql(connStr));   // 50-dars
builder.Services.AddScoped<IMahsulotService, MahsulotService>();          // 38-dars
builder.Services.AddAuthentication().AddJwtBearer();                       // 60-dars
builder.Services.AddCors();                                                // 69-dars

AddXxx — DI konteynerga servis va uning sozlamalarini ro'yxatdan o'tkazish. Tartib odatda muhim emas.


2. Middleware pipeline — app.Use

var app = builder.Build();      // servislar shu yerda "muzlaydi" — keyin qo'shib bo'lmaydi

Har bir UseXxx — so'rov o'tadigan "bekat". So'rov ularni yozilgan tartibda o'tadi, javob — teskari tartibda:

So'rov  ─▶ ExceptionHandler ─▶ HttpsRedirection ─▶ Cors ─▶ Authentication ─▶ Authorization ─▶ Controller
Javob   ◀─────────────────────────────────────────────────────────────────────────────────────────┘

Tavsiya etilgan tartib

app.UseExceptionHandler("/error");     // 1. xatolarni ushlash — eng boshida (65-dars)
app.UseHttpsRedirection();             // 2. HTTP → HTTPS
app.UseStaticFiles();                  // 3. statik fayllar (agar bo'lsa)
app.UseRouting();                      // 4. marshrutni aniqlash (ko'pincha avtomatik)
app.UseCors();                         // 5. CORS (69-dars)
app.UseAuthentication();               // 6. kim? (60-dars)
app.UseAuthorization();                // 7. ruxsat bormi? (61-dars)
app.UseRateLimiter();                  // 8. (70-dars)
app.MapControllers();                  // 9. endpoint lar

[!WARNING] Tartib muhim. UseAuthorization() ni UseAuthentication() dan oldin qo'ysangiz — foydalanuvchi hali aniqlanmagan, [Authorize] doim 401 qaytaradi. UseExceptionHandler keyinroq qo'yilsa — undan oldingi middleware lardagi xatolar ushlanmaydi. Yangi middleware qo'shganda uning o'rnini hujjatdan tekshiring.

Middleware lar haqida batafsil — 39-dars.


3. Endpoint lar — app.Map

app.MapControllers();                                  // controller lardagi [Route] lar
app.MapGet("/health", () => "OK");                     // minimal endpoint
app.MapHealthChecks("/health");                        // 74-dars

Muhitga qarab

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
    app.UseDeveloperExceptionPage();     // batafsil xato sahifasi — faqat development
}
else
{
    app.UseExceptionHandler("/error");
    app.UseHsts();
}

Muhit — ASPNETCORE_ENVIRONMENT o'zgaruvchisidan; launchSettings.json da lokal uchun Development.


Program.cs ni tartibli saqlash

Loyiha o'sgani sari Program.cs yuzlab qatorga aylanadi. Extension metodlar (31-dars) bilan guruhlang:

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddApi()
    .AddDatabase(builder.Configuration)
    .AddAuth(builder.Configuration)
    .AddApplicationServices();

var app = builder.Build();

app.UseApiPipeline();
app.Run();
public static class DependencyInjection
{
    public static IServiceCollection AddApplicationServices(this IServiceCollection s)
    {
        s.AddScoped<IMahsulotService, MahsulotService>();
        s.AddScoped<IBuyurtmaService, BuyurtmaService>();
        return s;
    }
}

[!TIP] Integration testlar (78-dars) uchun Program.cs ning oxiriga public partial class Program { } qo'shing — WebApplicationFactory<Program> top-level Program klassiga murojaat qila olishi uchun.


Tez-tez uchraydigan xatolar

Build dan keyin servis qo'shish:

var app = builder.Build();
builder.Services.AddScoped<IX, X>();   // ❌ InvalidOperationException: The service collection cannot be modified because it is read-only

AddControllers bor, MapControllers yo'q — barcha endpoint lar 404.

Middleware tartibi — Authentication va Authorization almashib qolgan.


Xulosa

Program.cs — ilovaning kirish nuqtasi, to'rt bosqich: servislar (builder.Services.AddXxx), builder.Build(), middleware pipeline (app.UseXxx), endpoint lar (app.MapXxx), app.Run().

CreateBuilder — konfiguratsiya, logging, Kestrel, DI va muhitni sozlaydi. Middleware lar yozilgan tartibda bajariladi — tartib muhim: xatolar → HTTPS → CORS → Authentication → Authorization → endpoint lar. Build() dan keyin servis qo'shib bo'lmaydi. Kattalashganda — extension metodlar bilan guruhlash.


Keyingi dars

38-dars: Dependency Injection — AddSingleton, AddScoped, AddTransient, nima farqi