0Pricing
C# Academy · Pelajaran

Dasar-Dasar Kontainer DI

Pahami pembalikan kendali, pendaftaran layanan, dan cara kontainer DI .NET menyelesaikan dependency.

Dasar-Dasar Kontainer DI adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Apa Itu Injeksi Dependensi

Injeksi Dependensi (DI) adalah pola desain ketika sebuah kelas menerima dependensinya dari sumber eksternal, bukan membuatnya sendiri.

Daripada menulis var repo = new UserRepository(); di dalam kelas, kelas tersebut menyatakan hal yang dibutuhkannya dan wadah DI menyediakannya.

Inversi Kendali

DI adalah penerapan konkret dari prinsip Inversion of Control (IoC): kendali untuk membuat dependensi dialihkan dari kelas yang bergantung ke wadah eksternal.

Hal ini membuat kelas lebih mudah diuji dan diganti.

Menyiapkan Wadah DI .NET

Dalam aplikasi .NET, wadah DI dikonfigurasi melalui IServiceCollection di Program.cs. Layanan didaftarkan, lalu diselesaikan oleh aplikasi saat berjalan.

var builder = WebApplication.CreateBuilder(args);

// Register services
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<UserService>();

var app = builder.Build();
app.Run();

Mendefinisikan Antarmuka & Implementasi

DI bekerja paling baik jika Anda memprogram berdasarkan antarmuka. Definisikan antarmuka untuk kontrak layanan dan kelas konkret yang mengimplementasikannya.

public interface IUserRepository
{
    User? GetById(int id);
}

public class UserRepository : IUserRepository
{
    public User? GetById(int id)
    {
        // fetch from database
        return new User { Id = id, Name = "Alice" };
    }
}

Menyelesaikan Layanan melalui Konstruktor

Wadah secara otomatis menyuntikkan layanan yang terdaftar ke dalam konstruktor. Kelas hanya perlu mendeklarasikan antarmuka yang dibutuhkannya — tidak memerlukan kata kunci new.

public class UserService
{
    private readonly IUserRepository _repo;

    public UserService(IUserRepository repo)
    {
        _repo = repo;
    }

    public User? FindUser(int id) => _repo.GetById(id);
}

Mendaftarkan Beberapa Layanan

Anda dapat mendaftarkan sebanyak mungkin layanan sesuai kebutuhan. Metode ekstensi yang umum adalah AddTransient, AddScoped, dan AddSingleton — masing-masing menentukan masa hidup yang berbeda.

builder.Services.AddSingleton<IConfig, AppConfig>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddTransient<IEmailService, SmtpEmailService>();
builder.Services.AddScoped<UserService>();

Menggunakan IServiceProvider Secara Langsung

Dalam kasus yang jarang terjadi, Anda perlu menyelesaikan layanan secara imperatif. IServiceProvider memungkinkan Anda memanggil GetRequiredService<T>() untuk menyelesaikan layanan, tetapi dalam sebagian besar situasi, utamakan injeksi melalui konstruktor.

// Anti-pattern (service locator) — use sparingly
public class ManualResolver
{
    private readonly IServiceProvider _sp;

    public ManualResolver(IServiceProvider sp) => _sp = sp;

    public void DoWork()
    {
        var svc = _sp.GetRequiredService<UserService>();
        svc.FindUser(1);
    }
}

Mendaftarkan Generik Terbuka

.NET DI mendukung pendaftaran generik terbuka. Anda dapat mendaftarkan IRepository<> sekali, lalu sistem akan menyelesaikannya menjadi Repository<T> untuk jenis entitas apa pun.

builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

// Resolves as:
// IRepository<User> -> Repository<User>
// IRepository<Order> -> Repository<Order>

Validasi saat Aplikasi Dimulai

Dengan ValidateOnStart() atau ValidateScopes = true, wadah dapat mendeteksi pendaftaran yang salah konfigurasi (misalnya menyimpan layanan Scoped di dalam Singleton) saat aplikasi dimulai, bukan saat runtime.

builder.Services.AddScoped<IMyService, MyService>();

// Detect scope violations at startup
builder.Host.UseDefaultServiceProvider(options =>
{
    options.ValidateScopes = true;
    options.ValidateOnBuild = true;
});

Menambahkan Dekorator pada Layanan

Anda dapat membungkus layanan dengan dekorator tanpa mengubah kelas aslinya. Daftarkan layanan bagian dalam terlebih dahulu, lalu daftarkan dekorator yang membungkusnya.

builder.Services.AddScoped<IUserRepository, UserRepository>();

// Decorator pattern
builder.Services.Decorate<IUserRepository, CachedUserRepository>();
// Requires Scrutor NuGet package

Dunia Nyata: API Minimal dengan DI

Dalam API Minimal, layanan disuntikkan langsung ke parameter penangan rute. Wadah menyelesaikannya secara otomatis.

app.MapGet("/users/{id}", (int id, UserService svc) =>
{
    var user = svc.FindUser(id);
    return user is null ? Results.NotFound() : Results.Ok(user);
});

Pemeriksaan Singkat

Metode apa yang sebaiknya Anda pilih untuk memperoleh dependensi di sebagian besar kelas?

Rangkuman: Dasar-Dasar Wadah DI

Hal-hal penting:

  • DI membalikkan proses pembuatan dependensi: wadah yang membuat objek, bukan kelas itu sendiri
  • Daftarkan layanan dengan AddTransient / AddScoped / AddSingleton
  • Injeksi konstruktor adalah pendekatan standar dan yang paling disarankan
  • Generik terbuka, dekorator, dan ValidateOnBuild adalah fitur lanjutan yang sangat berguna

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dasar-Dasar Kontainer DI” gratis?

Ya — teks lengkap “Dasar-Dasar Kontainer DI” 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 “Dasar-Dasar Kontainer DI”?

Pahami pembalikan kendali, pendaftaran layanan, dan cara kontainer DI .NET menyelesaikan dependency. 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 1 dari 4.

Berapa lama pelajaran “Dasar-Dasar Kontainer DI” 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