Inversion Of Control ve Dependency Injection Nedir?

M. Enes Oral
2 min readMar 5, 2020

--

Inversion Of Control (IoC)

Nesneye yönelik programlama teknikleri kullanıldığında nesneler arasındaki bağımlılıklar proje büyüdükçe daha da karmaşık bir hal almakta ve bu bağımlılıklar uygulamanın kod kalitesinin düşmesine sebebiyet vermektedir. Bu yüzden nesneler arasındaki bağımlılıkların kontrol altına alınması gerekmektedir. Bir çözüm yolu bağımlılıkların uygulama tarafından kontrol edilmesi yerine bu kontrolün, kullanılan uygulama çatısına devredilmesi olabilir. İşte tam olarak buna Inversion of Control denir. Adından da anlaşılacağı üzere kontrol tersine çevrilerek uygulamadan, kullanılan uygulama çatısına devredilir.

Java programlama dilinde nesneleri oluşturmak ve nesneler arası ilişkiyi kurmak yazılım geliştiricinin görevi iken nesneyi sonlandırmak çöp toplayıcı (garbage collector)’ün görevidir. Spring Framework kendi container servisleriyle ve IoC mekanizması ile Java nesnelerinin oluşturulması ve yaşam döngüsü tayin etme ve bu yaşam döngüsünü takip etme konusunda tüm sorumluluğu kendi üstüne almaktadır.

Dependency Injection (DI)

Sınıflar birbirlerini kullanarak yapılacak olan işlemleri gerçekleştirirler. Bu sınıflar arası bağımlılıkların oluşmasını sağlar.

public class UserController {
private UserServiceImpl userServiceImpl = new UserServiceImpl();
}

Yukarıdaki örnekte UserController sınıfı belirli işlemleri gerçekleştirebilmek için UserServiceImpl sınıfına bağımlıdır. Fakat UserController sınıfı içerisinde new operatörü ile nesne oluşturulması, UserController sınıfını direkt olarak UserServiceImpl sınıfına bağımlı kılmaktadır. Bu Dependency Inversion Principle’a aykırıdır. Çünkü bağımlılığın yönünün soyut sınıflara doğru olması gerekirken burada somut bir sınıfa doğru olmuştur. Herhangi bir şekilde UserServiceImpl sınıfı değişikliğe uğrarsa, UserController bu değişiklikten direkt olarak etkilenecektir.

public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
}

Yukarıdaki örnekte ise UserController sınıfı bu sefer somut bir sınıfa bağımlı olmamakla birlikte new operatörünü kullanarak bağımlılığını kendisi oluşturmuyor. Peki bu bağımlılık nasıl oluşuyor? UserController sınıfı oluşturulduğu anda constructor metoduna uygulama çatısı tarafından herhangi bir UserService implementasyonu gönderilerek bu bağımlılık enjekte ediliyor. Bu işleme Dependency Injection yani bağımlılıların enjekte edilmesi denir.

Sıkı bağlardan gevşek bağlara..

Inversion of Control mekanizmasını kullanan Spring Framework’ü anlattığım yazıya buradan ulaşabilirsiniz.

End Of File

Daha fazlası için:

--

--