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 packageDunia 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
- Dasar-Dasar Kontainer DI
- Masa Hidup Layanan: Transient, Scoped, Singleton
- Injection Konstruktor & Interface
- Pola Factory & Options