Reference · Backend
Layered architecture ASP.NET Core Web API
Ringkasan satu halaman. Dari Lesson 0001.
Alur request
HTTP→Middleware→
Controller→Service→
Repository→DbContext→DB
Hasil kembali sebagai DTO, dan Controller memilih status HTTP-nya.
Folder & tanggung jawab
| Folder | Boleh berisi | Tidak boleh berisi | Padanan Express |
|---|---|---|---|
Controllers/ | Routing attribute, binding, pilihan status code | Aturan bisnis, query DB | routes + controllers |
DTOs/ | record request/response | Logika | Zod/Joi schema |
Services/ | Aturan bisnis, mapping Entity ↔ DTO | HttpContext, ActionResult, DbContext | services/ |
Repositories/ | Query & simpan via DbContext | Aturan bisnis | data-access layer |
Models/ | Entity (Product, Category) | Atribut HTTP | Prisma model |
Data/ | AppDbContext, Migrations | Aturan bisnis | Prisma client + migrate |
Config/ | Kelas Options, extension AddXxx() | Secret (taruh di User Secrets/env) | config/ + .env |
Program.cs | Registrasi DI, urutan middleware | Logika bisnis | app.js / server.js |
Tiga aturan
- Layer hanya memanggil layer di bawahnya. Controller tidak memakai
DbContextlangsung, dan tidak berisi aturan bisnis. [1] [3] - Bergantung pada interface (
IProductService,IProductRepository), bukan kelas konkret dan tanpanew. [2] - Hanya composition root (
Program.cs) yang tahu implementasi konkret. [1]
builder.Services.AddDbContext<AppDbContext>(o => o.UseSqlServer(cfg.GetConnectionString("Default")));
builder.Services.AddScoped<IProductRepository, ProductRepository>();
builder.Services.AddScoped<IProductService, ProductService>();
builder.Services.Configure<JwtSettings>(cfg.GetSection("Jwt"));
Jawaban 60 detik
Layered dalam satu project. Controller = HTTP, Service = aturan bisnis, Repository = akses data via EF Core. DTO memisahkan kontrak API dari skema DB. Semua bergantung pada interface dan disambungkan di Program.cs (composition root), sehingga Service bisa di-unit-test dengan mock. Config lewat appsettings + Options Pattern. Kalau domain bertambah kompleks, pindah ke Clean Architecture.
Pertanyaan lanjutan yang mungkin muncul
- "Kenapa DTO?" → mencegah over-posting, menyembunyikan property, payload lebih kecil, object graph lebih datar; skema DB tidak bocor. [4]
- "Kenapa Service tidak memakai
new?" → dependensi langsung sulit diganti dan sulit di-unit-test; DI memakai interface + registrasi di container + injeksi lewat constructor. [2] - "Kenapa Options Pattern?" → akses konfigurasi bertipe per kelompok setting (encapsulation, separation of concerns). [5] Detail: lesson 0005.
- "Repository di atas EF Core perlu?" → pro/kontra di lesson 0011.
- "Layer vs tier?" → layer = pemisahan logis, tier = pemisahan fisik (server/proses berbeda). [1]
Sumber: [1] Microsoft Learn: Common web application architectures · [2] Dependency injection in ASP.NET Core · [3] Handle requests with controllers · [4] Tutorial web API: Prevent over-posting · [5] Options pattern