0Pricing
C# Academy · Pelajaran

Masa Hidup Layanan: Transient, Scoped, Singleton

Pelajari pengaruh masa hidup Transient, Scoped, dan Singleton terhadap pembuatan, penggunaan bersama, dan pembuangan objek.

Masa Hidup Layanan: Transient, Scoped, Singleton adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Mengapa Masa Hidup Penting

Masa hidup layanan mengatur berapa lama sebuah instans hidup dan berapa banyak instans yang dibuat. Memilih masa hidup yang salah dapat menyebabkan masalah tersembunyi, seperti kebocoran data antarpermintaan atau pembuatan objek secara berlebihan.

Transient: Baru Setiap Kali

Layanan Transient dibuat dari awal setiap kali diminta dari wadah. Gunakan layanan ini untuk layanan ringan dan tanpa status, ketika berbagi status dapat berbahaya.

builder.Services.AddTransient<IEmailSender, SmtpEmailSender>();

// Each resolution creates a new instance:
// var a = sp.GetRequiredService<IEmailSender>(); // new
// var b = sp.GetRequiredService<IEmailSender>(); // new (different)

Scoped: Sekali per Permintaan

Layanan Scoped dibuat sekali untuk setiap cakupan — biasanya satu permintaan HTTP di ASP.NET Core. Instans yang sama digunakan bersama dalam satu permintaan, tetapi instans baru dibuat untuk permintaan berikutnya.

builder.Services.AddScoped<AppDbContext>();

// Within a single HTTP request:
// Both resolve to the SAME AppDbContext instance
// -> consistent unit of work across the request

Singleton: Satu Selama Masa Hidup Aplikasi

Layanan Singleton dibuat sekali dan digunakan kembali selama seluruh masa hidup aplikasi. Gunakan layanan ini untuk layanan yang mahal dibuat dan aman digunakan oleh banyak utas, seperti tembolok konfigurasi.

builder.Services.AddSingleton<IMemoryCache, MemoryCache>();

// Or register a pre-built instance:
var config = new AppConfig { MaxRetries = 3 };
builder.Services.AddSingleton<IAppConfig>(config);

Membandingkan Ketiganya

Perbandingan singkat secara berdampingan:

  • Transient — instans baru pada setiap permintaan; utilitas tanpa status
  • Scoped — satu untuk setiap permintaan HTTP; DbContext, Unit Kerja
  • Singleton — satu selama masa hidup aplikasi; tembolok, konfigurasi

Masalah Dependensi Tertawan

Menyuntikkan layanan Scoped atau Transient ke dalam Singleton adalah kesalahan yang umum. Singleton menyimpan referensi ke layanan yang masa hidupnya singkat, sehingga layanan tersebut tetap hidup terlalu lama.

// BAD: Singleton captures a Scoped service
public class MySingleton
{
    private readonly AppDbContext _db; // Scoped!
    public MySingleton(AppDbContext db) => _db = db;
    // _db is now stuck alive for the app's lifetime
}

Mendeteksi Pelanggaran Cakupan

Aktifkan ValidateScopes agar wadah menghasilkan kesalahan saat aplikasi dimulai jika dependensi tertawan terdeteksi. Dengan demikian, kesalahan dapat ditemukan sebelum menyebabkan masalah data di lingkungan produksi.

builder.Host.UseDefaultServiceProvider(options =>
{
    options.ValidateScopes = true;   // detect captive deps
    options.ValidateOnBuild = true;  // fail fast at start
});

Layanan Scoped di Luar Permintaan

Untuk menyelesaikan layanan Scoped dalam tugas latar belakang, buat cakupan eksplisit menggunakan IServiceScopeFactory. Jangan pernah menyelesaikan layanan Scoped secara langsung dari wadah akar.

public class MyWorker : BackgroundService
{
    private readonly IServiceScopeFactory _factory;

    public MyWorker(IServiceScopeFactory factory) => _factory = factory;

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        using var scope = _factory.CreateScope();
        var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
        await db.Users.ToListAsync(ct);
    }
}

Layanan Disposable Transient

Layanan IDisposable Transient yang diselesaikan dari wadah akar akan dilacak sampai wadah dibuang (saat aplikasi berhenti). Selesaikan layanan tersebut di dalam cakupan agar sumber daya segera dilepaskan.

// Correctly scoped transient disposable
using var scope = sp.CreateScope();
var svc = scope.ServiceProvider.GetRequiredService<MyDisposableService>();
await svc.DoWorkAsync();
// svc.Dispose() called when scope is disposed

Memilih Masa Hidup yang Tepat

Panduan keputusan sederhana:

  • Apakah layanan tidak memiliki status? → Transient
  • Apakah layanan bergantung pada permintaan (misalnya identitas pengguna, DbContext)? → Scoped
  • Apakah layanan aman digunakan oleh banyak utas dan mahal dibuat? → Singleton

Dunia Nyata: Tiga Masa Hidup Bersama

API web pada umumnya mendaftarkan berbagai layanan dengan masa hidup yang sesuai demi ketepatan dan kinerja.

builder.Services.AddSingleton<IConfiguration>(builder.Configuration);
builder.Services.AddSingleton<ICacheService, RedisCacheService>();

builder.Services.AddScoped<AppDbContext>();
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddScoped<OrderService>();

builder.Services.AddTransient<IEmailSender, SendGridEmailSender>();

Pemeriksaan Singkat

Masalah apa yang terjadi ketika layanan Singleton menyimpan referensi ke layanan Scoped?

Rangkuman: Masa Hidup Layanan

Hal-hal penting:

  • Transient: instans baru setiap kali — cocok untuk layanan ringan tanpa status
  • Scoped: satu instans per permintaan — DbContext, repositori, unit kerja
  • Singleton: satu instans selamanya — tembolok, konfigurasi, utilitas yang aman digunakan oleh banyak utas
  • Jangan pernah menyuntikkan layanan bermasa hidup singkat ke dalam layanan yang masa hidupnya lebih panjang (dependensi tertawan)
  • Gunakan IServiceScopeFactory untuk menyelesaikan layanan Scoped dalam tugas latar belakang

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Masa Hidup Layanan: Transient, Scoped, Singleton” gratis?

Ya — teks lengkap “Masa Hidup Layanan: Transient, Scoped, Singleton” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Masa Hidup Layanan: Transient, Scoped, Singleton”?

Pelajari pengaruh masa hidup Transient, Scoped, dan Singleton terhadap pembuatan, penggunaan bersama, dan pembuangan objek. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Masa Hidup Layanan: Transient, Scoped, Singleton” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Kontainer DI
  2. Masa Hidup Layanan: Transient, Scoped, Singleton
  3. Injection Konstruktor & Interface
  4. Pola Factory & Options
← Kembali ke C# Academy