Program.cs — WebApplication.CreateBuilder, middleware pipeline
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.csvaStartup.cs(ConfigureServicesvaConfiguremetodlari 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()niUseAuthentication()dan oldin qo'ysangiz — foydalanuvchi hali aniqlanmagan,[Authorize]doim 401 qaytaradi.UseExceptionHandlerkeyinroq 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.csning oxirigapublic partial class Program { }qo'shing —WebApplicationFactory<Program>top-levelProgramklassiga 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