DI Kapsayıcılarının Temelleri
Denetimin tersine çevrilmesini, hizmet kaydını ve .NET DI kapsayıcısının bağımlılıkları nasıl çözdüğünü anlayın.
DI Kapsayıcılarının Temelleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Bağımlılık Enjeksiyonu Nedir?
Bağımlılık Enjeksiyonu (DI), bir sınıfın bağımlılıklarını kendisi oluşturmak yerine dış bir kaynaktan aldığı bir tasarım desenidir.
Bir sınıfın içinde var repo = new UserRepository(); yazmak yerine sınıf, neye ihtiyaç duyduğunu bildirir ve DI kapsayıcısı bunu sağlar.
Denetimin Tersine Çevrilmesi
DI, Denetimin Tersine Çevrilmesi (IoC) ilkesinin somut bir uygulamasıdır: bağımlılıkları oluşturma denetimi, bağımlı sınıftan dış bir kapsayıcıya aktarılır.
Bu, sınıfları test etmeyi ve değiştirmeyi kolaylaştırır.
.NET DI Kapsayıcısını Kurma
Bir .NET app'inde DI kapsayıcısı, IServiceCollection aracılığıyla Program.cs içinde yapılandırılır. Hizmetler kaydedilir ve ardından çalışma zamanı tarafından çözümlenir.
var builder = WebApplication.CreateBuilder(args);
// Register services
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<UserService>();
var app = builder.Build();
app.Run();Arayüz ve Uygulamanın Tanımlanması
DI, arayüzlere göre programladığınızda en iyi şekilde çalışır. Hizmet sözleşmesi için bir arayüz ve bunu uygulayan somut bir sınıf tanımlayın.
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" };
}
}Yapıcı Üzerinden Hizmetleri Çözümleme
Kapsayıcı, kaydedilmiş hizmetleri yapıcılara otomatik olarak ekler. Sınıfın yalnızca ihtiyaç duyduğu arayüzü bildirmesi yeterlidir — new anahtar sözcüğü gerekmez.
public class UserService
{
private readonly IUserRepository _repo;
public UserService(IUserRepository repo)
{
_repo = repo;
}
public User? FindUser(int id) => _repo.GetById(id);
}Birden Çok Hizmet Kaydetme
İhtiyaç duyduğunuz kadar hizmet kaydedebilirsiniz. Yaygın uzantı metotları AddTransient, AddScoped ve AddSingleton'dır — her biri farklı bir ömür tanımlar.
builder.Services.AddSingleton<IConfig, AppConfig>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddTransient<IEmailService, SmtpEmailService>();
builder.Services.AddScoped<UserService>();IServiceProvider'ı Doğrudan Kullanma
Nadir durumlarda hizmetleri emirli bir şekilde çözümlemeniz gerekir. IServiceProvider, bir hizmeti çözümlemek için GetRequiredService<T>() çağırmanıza olanak tanır; ancak çoğu senaryoda yapıcı üzerinden bağımlılık eklemeyi tercih edin.
// 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);
}
}Açık Genel Türleri Kaydetme
.NET DI, açık genel tür kayıtlarını destekler. IRepository<> türünü bir kez kaydedebilir ve herhangi bir varlık türü için bunun Repository<T> olarak çözümlenmesini sağlayabilirsiniz.
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
// Resolves as:
// IRepository<User> -> Repository<User>
// IRepository<Order> -> Repository<Order>Başlangıçta Doğrulama
ValidateOnStart() veya ValidateScopes = true ile kapsayıcı, yanlış yapılandırılmış kayıtları (örneğin bir Singleton içinde Scoped hizmet yakalanmasını) çalışma zamanında değil, uygulama başlatılırken algılayabilir.
builder.Services.AddScoped<IMyService, MyService>();
// Detect scope violations at startup
builder.Host.UseDefaultServiceProvider(options =>
{
options.ValidateScopes = true;
options.ValidateOnBuild = true;
});Hizmetleri Dekore Etme
Özgün sınıfı değiştirmeden bir hizmeti dekoratörle sarmalayabilirsiniz. Önce iç hizmeti, ardından onu saran dekoratörü kaydedin.
builder.Services.AddScoped<IUserRepository, UserRepository>();
// Decorator pattern
builder.Services.Decorate<IUserRepository, CachedUserRepository>();
// Requires Scrutor NuGet packageGerçek Dünya: DI ile Minimal API
Minimal API'de hizmetler doğrudan rota işleyicisi parametrelerine eklenir. Kapsayıcı bunları otomatik olarak çözümler.
app.MapGet("/users/{id}", (int id, UserService svc) =>
{
var user = svc.FindUser(id);
return user is null ? Results.NotFound() : Results.Ok(user);
});Hızlı Kontrol
Çoğu sınıfta bağımlılıkları elde etmek için hangi yöntemi tercih etmelisiniz?
Özet: DI Kapsayıcısının Temelleri
Temel çıkarımlar:
- DI, bağımlılık oluşturmayı tersine çevirir: nesneleri sınıfın kendisi değil, kapsayıcı oluşturur
- Hizmetleri AddTransient / AddScoped / AddSingleton ile kaydedin
- Yapıcı üzerinden bağımlılık ekleme, standart ve tercih edilen yaklaşımdır
- Açık genel türler, dekoratörler ve ValidateOnBuild güçlü gelişmiş özelliklerdir
Sıkça Sorulan Sorular
“DI Kapsayıcılarının Temelleri” dersi ücretsiz mi?
Evet — “DI Kapsayıcılarının Temelleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“DI Kapsayıcılarının Temelleri” dersinde ne öğreneceğim?
Denetimin tersine çevrilmesini, hizmet kaydını ve .NET DI kapsayıcısının bağımlılıkları nasıl çözdüğünü anlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“DI Kapsayıcılarının Temelleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- DI Kapsayıcılarının Temelleri
- Hizmet Ömürleri: Geçici, Kapsamlı, Singleton
- Kurucu Enjeksiyonu ve Arayüzler
- Fabrika ve Seçenekler Desenleri