Dependency Injection, Dependency Inversion ve Inversion of Control Kavramları

Özellikle büyük projelerde yazılım tasarımı çok önemlidir. İyi tasarlanmış bir yazılımda geliştirme daha rahat yapılabilmektedir. Bu noktada en önemli kavramlardan biri de Dependency Injection’dır.

Dependency Injection nedir?

public class Employee{

private DBHelper helper;
public Employee(){
helper = new DBHelper();
} .... ...}

Yukarıdaki klasik yöntemle yazılmış class’ın constructor’ında DBHelper türünden helper nesnesi oluşturuluyor. Bu durumda Employee class’ı DBHelper class’ına bağımlı hale gelmiş oluyor(tightly coupled). Eğer DBHelper yerine başka bir helper class’ı kullanmak isterseniz Employee class’ını güncellemeniz gerekecek. Bu durumdan kaçınmak için Dependency Inversion Principle(DIP) kullanılır. Dependency Inversion prensibine göre yüksek seviye modüller, düşük seviye modüllere bağlı olmamalı. Her ikisi de soyut (abstract) kavramlara bağlı olmalıdır. Yani DBHelper class’ına bağımlı olmamak için interface veya abstract class kullanmalıyız.

public class Employee{

private IDBHelper helper;
public Employee(){
helper = new DBHelper();
} ... ...}

Yukarıdaki kodumuz her ne kadar ilk yazılan koddan iyi olsa da hala bir problem var. helper nesnesi hala Employee class’ı içerisinde oluşturuluyor. Bu noktada karşımıza Inversion of Control(IoC) prensibi çıkıyor. Bu prensibe göre bağımlılıkları oluşturmanın kontrölü dışarıdan olmalıdır. Bu örneğimiz üzerinden açıklamak istersek Employee class’ı helper nesnesini oluşturmamalı, bu nesneyi dışarıdan almalı. Dependency Injection, IoC prensibini implement eden bir design patern’dır. Bağımlılıklar class’a dışarıdan “enjekte” edilir.

public class Employee{

private IDBHelper helper;
public Employee(IDBHelper helper){
this.helper = helper;
}... ...}

helper nesnesini parametre ile dışarıdan alarak dependency injection yapmış oluyoruz. IDBHelper interface’ini implement eden her class’ın nesnesi Employee class’ı içerisinde kullanilebilir duruma gelmiş oldu. Böylelikle bağımlılığı minimuma indirmiş olduk(loosely coupled).

 

Dependency Injection avantajları nelerdir?

  • Yazılımı oluşturan yapıların birbirleri ile olan bağımlılıkları azalır,
  • Kod tekrarını azaltır,
  • Yazılımın geliştirilmesini kolaylaştırır,
  • Test edilebilmeyi kolaylaştırır.