M E D Y A T Ö R

.NET Core MVC'de Bağımlılıkları Kolayca Yönetmenin ve Dependency Injection ile Yazılımınızı Güçlendirmenin Yolu

20

KASIM

2024


Görüntülenme

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. 

En Çok Okunanlar


Dependency Injection'in Temel Faydaları

  1. 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.
  2. 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.
  3. 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

En Çok Okunanlar

.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

-Yukarıdaki örnekte olduğu gibi, .NET Core MVC'de DI kullanarak, sınıflar arasındaki bağımlılıkları yönetmek çok kolay hale gelir. Böylece:

-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.