Dependency Injection (DI) Ve Dependency Inversion Principle (DIP) Nedir?

Emir Emre Şahna
folksdev
Published in
3 min readOct 7, 2022

Bu makalemde Dependency Injection ve Dependency Inversion Principle konularından bahsettim, keyifli okumalar…

Dependency Nedir?

Farz edelim ki A adında bir sınıfımız var. Ve bu A sınıfı, B sınıfındaki metotları kullanıyor. Yani A sınıfı, B sınıfına dayanır. İşte bu duruma dependency (bağımlılık) denir. A sınıfındaki bir işlemin olması için B sınıfından bir örnek veya kopya barındırması gerekir.

Dependency Injection Nedir ?

Dependency Injection genel anlamda metotla bağımlılığın objesini oluşturmak yerine bu bağımlılığın objesini metoda parametre olarak eklemek anlamına gelir.

Dependency Inversion Principle Nedir?

Dependency Inversion Principle, somut bir sınıfı yerine soyut bir sınıfı tercih eder. Böylece alt sınıftaki değişiklik üst sınıfı bozmaz çünkü arada bir soyut sınıf vardır. Ayrıca Dependency Inversion Principle, SOLID prensiplerinden biridir.

Bu konuyu daha anlaşılabilir olması için bir örnek yapalım.

Oluşturduğumuz bu kodun 2 kötü yanı var. Birincisi User sınıfımıza unit test yazmamız nerdeyse imkansız çünkü MySqlDatabase instance’ına bağımlıyız. Ve bu instance test yazarken taklit edilemiyor. İkincisi ise MySqlDatabase’i sabit kodladığımız için başka bir database kullanmak istersek bunu yapamayız.

İlk sorunumuzu çözmek için Dependency Injection kullanacağız.

User sınıfımızın yapıcı metoduna MySqlDatabase parametresi ekleyerek sınıfımızı bu bağımlılıktan kurtarmış olmakla beraber artık User sınıfımıza unit test yazılabilir hale getirdik. Sonuç olarak User sınıfımızı oluşturduğumuzda bir MySqlDatabase instance’ı pass etmemiz gerekiyor.

İlk sorunumuzu çözdük. Şimdi sıra geldi ikinci sorunumuza. Burada devreye Dependency Inversion Principle giriyor.

Bir Database soyut sınıfı oluşturduk ve bu sınıfı iki database sınıfımıza da implemente ettik. Böylece database sınıflarıyla User sınıfımız arasında bir soyut sınıf oluşturmuş olduk. User sınıfımız artık somut bir sınıf yerine soyut bir sınıfa bağımlı oldu. Artık User sınıfımıza rahatlıkla MySqlDatabase ve OracleDatabase sınıfımızın instance’ını pass edebiliriz.

Dependency Injection Avantajları Nelerdir?

Kodumuzun bağımlılığını azaltır. Okunurluluğu arttırır. Test edilebilir hale getirir.

Dependency Injection Uygulamanın Diğer Bir Yolu Nedir?

Dependency Injection, yapıcı metodun yanı sıra setter metot ile de yapılabilir.

Kodumuza bir setter metot yazarak ve bunu dışarıya açarak database’imizi inject edebiliriz.

Kaynakça

https://en.wikipedia.org/wiki/Dependency_injection https://www.youtube.com/watch?v=oqYRl06DNHQ https://www.youtube.com/watch?v=EPv9-cHEmQw

--

--