Dependency Injection



Dependency Injection

Dependency Injection programcılara daha okunabilir, tekrar kullanılabilir, güvenilir ve performanslı çalışan bir uygulama yaratma imkanı sunan oldukça kullanışlı bir prensiptir. Kelimeler üstünden tanımlama yapmaya devam edersek dependency kelimesi bağımlı olunan şey anlamına gelmektedir. Örnek vermek gerekirse, bir duvar ustasının duvarı örmesi için kullanmak zorunda olduğu yani bağımlı olduğu araçlardan olan mala gibi. Injection ise günlük hayatta kullanılan anlamına gelmektedir. Nasıl ki aşı zamanı geldiğinde vücudumuza ilaç bir enjökter ile veriliyorsa, programlama da bir sınıfın bağımlı olduğu diğer sınıfları bu sınıfların içerisine enjekte etmek olarak tanımlanabilir. Toparlamak gerekirse Dependency Injection bağımlı olduğumuz sınıfları, kendi sınıflarımız içine enjekte ederek kullanmaktır.

Dependency Inversion konusunda kullanmış olduğumuz örnek üzerinden gidersek, yaptığımız şey basitçe  MailOperations nesnesini kullanmadan önce; hangi mail servisini kullanarak işlemleri yapacağını belirtiyoruz. Bunu yaparken IMailService interface'ini parametre olarak MailOperations sınıfına veriyoruz. Bunun içinde üç farklı yöntem kullanıyoruz.

  1. Constructor Injection
  2. Property Injection
  3. Method Injection
Bunları incelersek;

1.Constructor Injection

En popüler DI yöntemlerinden biridir. Sınıfın ihtiyaç duyduğu nesne, constructor üzerinden parametre ile verilir. Örnek bir kod üzerinde inceleyecek olursak;


MailOperations sınıfının constructor'unda IMailService interface'sini parametre olarak belirledik. Bu yöntem sayesinde IMailService tipinde bir nesneyi parametre olarak vermeden MailOperations sınıfının bir örneğini yaratamayız. Bu sayede MailOperations sınıfı _mailService nesnesi hakkında bir şey bilmek zorunda kalmayacak . Bu sayede daha kullanışlı ve "loosely coupled" bir tasarıma sahip olacağız.

2.Property Injection

İhtiyacımız durumunda kullanılacak nesnenin opsiyon olarak verileceği durumlarda kullanılır. Bu durumda yapılması gereken değer atanabilen bir property oluşturmaktır.


Değer atanabilen bir property olduğu için bu değerin null gelebileceği durumlar olduğundan SendMail() metodunda null referance kontrolünün yapılması gerekmektedir.

3.Method Injection

Metotları çağırdığımızda değişebilecek bağımlılıkların olması durumunda bu metodu kullanırız. İhtiyacımız olan Interface'i, bağlılığı kullanacak olan metodun parametresine atadığımız zaman bu metodu her çağırdığımızda parametreden gelen bağımlılığı kullanmış oluruz.


Dependency Injection prensibinin uygulanması bu şekildeydi. MailOperations nesnesinin bağımlılığını uygulama çalışırken değiştirmemiz gerektiğinde IoC Container kullanmamız gerekir.


Yorumlar