Dependency Injection Nedir?
Günümüzde yazılım geliştirmede kullanılan en etkili desenlerden biri Dependency Injection (DI), yani bağımlılık enjeksiyonu, özellikle .NET Core MVC gibi modern framework’lerde çok önemli bir rol oynar. Peki, Dependency Injection tam olarak nedir ve neden bu kadar önemli?
Dependency Injection, bir sınıfın ihtiyaç duyduğu bağımlılıkları dışarıdan almasını sağlayan bir tasarım desenidir. Bu, bağımlılıkların sınıfın içerisinde değil, dışarıda yönetilmesini sağlar. Böylece daha esnek, test edilebilir ve sürdürülebilir kodlar yazmak mümkün hale gelir.
Dependency Injection'in Temel Faydaları
- Kodun Esnekliği Artar
DI sayesinde sınıflar, birbirlerinden bağımsız hale gelir. Bu, bir sınıfı değiştirdiğinizde diğer sınıfların etkilenmesini engeller. - Test Edilebilirlik
DI, bağımlılıkları dışarıdan almanızı sağladığı için testlerinizi daha kolay yazmanıza olanak tanır. Örneğin, dış bağımlılıkları mock (taklit) nesneleri ile değiştirebilirsiniz. - Daha Az Bağımlılık
DI, sınıfların birbiriyle daha az bağımlı olmasını sağlar. Bu da daha sade ve bakımı kolay bir kod yapısı oluşturur

.NET Core MVC'de Dependency Injection Nasıl Çalışır?
.NET Core MVC, Dependency Injection'ı yerleşik olarak destekler. Yani dışarıdan herhangi bir kütüphane eklemeden, DI kullanarak bağımlılıkları yönetebilirsiniz. Şimdi, .NET Core MVC'de DI'yi nasıl kullanacağınızı adım adım inceleyelim.
Bağımlılığımızı
Tanımlayalım
Öncelikle bir örnek üzerinden gidelim. Diyelim ki bir IEmailService sınıfına ihtiyacımız var:
public interface IEmailService { void SendEmail(string to, string subject, string body); } |
Bu interface, e-posta gönderecek temel metodu tanımlar. Şimdi bu interface’i implement eden bir sınıf oluşturalım:
public class EmailService : IEmailService { public void SendEmail(string to, string subject, string body) { // E-posta gönderme işlemi burada gerçekleşir Console.WriteLine($"E-posta gönderildi: {to}, {subject}, {body}"); } } |
Dependency Injection Konfigürasyonu
Şimdi, bu EmailService sınıfını .NET Core MVC'ye DI ile ekleyelim. Bunun için Startup.cs dosyasına gidiyoruz ve ConfigureServices metodunda servisimizi kaydediyoruz:
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IEmailService, EmailService>(); } |
Bu satır, IEmailService interface’ini EmailService sınıfıyla ilişkilendirir. AddTransient metodu, her bağımlılık istenildiğinde yeni bir örneğin oluşturulmasını sağlar. Burada başka bir seçenek de AddSingleton ve AddScoped olabilir, ancak AddTransient her seferinde yeni bir instance (örnek) oluşturur.
Bağımlılığın Enjekte Edilmesi
Şimdi, DI ile sağladığımız EmailService’i bir controller’a enjekte edelim. HomeController’a gidelim:
public class HomeController : Controller { private readonly IEmailService _emailService; public HomeController(IEmailService emailService) { _emailService = emailService; } public IActionResult Index() { _emailService.SendEmail("test@example.com", "Merhaba!", "Bu bir test e-postasıdır."); return View(); } } |
Burada gördüğünüz gibi, constructor injection kullanarak IEmailService'i controller’a enjekte ettik. Artık HomeController sınıfı, EmailService'e bağımlı olduğu için, bağımlılık dışarıdan enjekte edilir.
Dependency Injection ile Yazılımınızı Güçlendirin
-Kodunuzu daha esnek hale getirebilirsiniz. Her sınıf sadece ihtiyaç duyduğu bağımlılığı alır, bu da sınıfların daha bağımsız ve esnek olmasını sağlar.
- -Test yazmayı daha kolay hale getirebilirsiniz. DI sayesinde gerçek servislerin yerine mock nesneleri kullanarak testler yazabilirsiniz.
- Bakımı daha kolay bir yazılım oluşturabilirsiniz. Bir sınıfı değiştirdiğinizde, diğer sınıfların etkilenmesini önler. Bu, bakım süreçlerini çok daha verimli hale getirir.
DI ile Veritabanı Bağımlılığı
Bir diğer yaygın kullanım senaryosu da veritabanı bağlantılarıdır. Diyelim ki bir IDatabaseService servisi oluşturmak istiyoruz:
public interface IDatabaseService { void Connect(); } public class DatabaseService : IDatabaseService { public void Connect() { // Veritabanı bağlantısı Console.WriteLine("Veritabanına bağlanıldı."); } } |
Bu servisi de yine DI ile kaydedelim:
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IDatabaseService, DatabaseService>(); } |
Ve controller’da bunu kullanarak veritabanı bağlantısını gerçekleştirelim:
public class HomeController : Controller { private readonly IDatabaseService _databaseService; public HomeController(IDatabaseService databaseService) { _databaseService = databaseService; } public IActionResult Index() { _databaseService.Connect(); return View(); } } |
Burada DI, veritabanı bağlantısının yönetilmesini çok daha kolay hale getiriyor. Veritabanı servisini dışarıdan yönetmek, özellikle test ederken büyük avantaj sağlar.
Dependency Injection, .NET Core MVC uygulamalarında
bağımlılıkları yönetmenin ve yazılımınızı güçlendirmenin en etkili yollarından
biridir. Hem esneklik, hem test edilebilirlik, hem de kolay
bakım sağlar. DI kullanarak yazılımınızı daha sürdürülebilir, daha verimli
ve daha yönetilebilir hale getirebilirsiniz.