Adım Adım Dagger2–1. Bölüm

Murat Karaöz
3 min readSep 7, 2018

--

Dependency Injection Nedir?

Dependency Injection bir sınıfa ihtiyaç değişkenlerini vermektir. Bu sayede sınıf bu değişkenleri new anahtar kelimesi ile kendisi yaratacağına dışarıdan almış olur.

Dependency Injcetion kavramının kısa ve öz anlatımını James Shore tarafından yazılan Dependency Injection Demystified başlıklı blogda bulabilirsiniz.

Dagger2 Nedir?

Dagger 2, injection işlemini otomatikleştiren bir kütüphanedir. Kod içinde dependency isteyen sınıfı bularak, istenen dependency’i kimin sağladığını tespit eder ve ihtiyaç duyulan dependency’i sağlayıcıdan alıp istek yapana iletir.

Dagger’ı Activity, Service ve Fragment kurucu metodunu bizim çağırmadığımız bileşenler için kullanıp diğer sınıflarda constructor injection yapmak kodu basit ve okunabilir hale getirecektir. Her sınıf için Dagger kullanmak kodu gereksiz yere karmaşıklaştırır.

DI frameworks should be used in order to resolve critical dependencies in “top level” components (Service, Activity, Fragment, etc.) right after creation (because you can’t use “constructor” injection in Android’s “top-level” components), and that’s it.” [stackoverflow]

Dagger2'nin temel bileşenleri nelerdir?

  • @Inject ile dependency istenir. İhtiyaç bu annotation ile tanımlanır.
  • @Module ile işaretlenen sınıflar @Inject ile istenen dependency’leri sağlamakla yükümlüdür. Eğer bir sınıfın başına @Module gelirse Dagger bu sınıfın bir dependency provider olduğunu anlar.
  • @Provider modül sınıfları içinde dependecy’leri yaratıp döndüren fonksiyonların başına elenir. Bu sayede Dagger modül içinde hangi metotlara bakması gerektiğini bilir.
  • @Component injection işlemini yapan sınıftır. @Inject ve @Module ile tanımlanan, “istek yapan ve isteğe cevap veren”, sınıfları bir araya getiren köprüdür.

@Inject’in ihtiyaç duyduğu şey @Component aracılığı ile @Module’den gelir.

Kaç çeşit Injection tipi vardır?

Dagger2 de 3 farklı injection yöntemi vardır.

  1. Constructor Injection
  2. Field Injection
  3. Method Injection

Constructor Injection

Constructor’ın üzerine @Inject annotation’ı koyularak yapılır. Bu durumda kurucu metodun tüm parametreleri Dagger tarafından temin edilir.

  • Bir sınıf içinde sadece bir constructor’ın başına @Inject eklenebilir.
  • Constructor injection yapıldığında tepesine inject gelen kurucu metot da dependency graph’ın bir parçası olur ve başka bir yerde kendisi inject edilebilir. Yani; Car nesnesine ihtiyaç duyan bir sınıf artık bu nesneyi Garage.java örneğindeki gibi inject edebilir.
  • Kendi yarattığımız sınıflar için modül sınıfları ve provider metoları yazmak yerine, üstteki örnekte olduğu gibi kurucu metotların üzerine @Inject ekleyerek sınıfı inject edilebilir hale getirebiliriz. Modül sınıfları 3. parti kütüphaneler ve Android frameworküne ait sınıflar için yazılabilir. Bu videoda abi bundan bahsediyor: https://youtu.be/plK0zyRLIP8?t=1003
Kendi yazdığımız TwitterApi sınıfı için modüle içine Provider metodu eklemişiz. Bu metodu silip TwitterApi sınıfındaki kurucu metodun üzerine @Inject ekleyebiliriz.
Provide metodunu siliyoruz.
Kurucu metodun başına @Inject ekliyoruz.

Field Injection

Sınıf içinde bir değişkenin üzerine @Inject eklenerek bu değişken sınıfa inject edilebilir. Örneğin bir activity içinde Car nesnesine ihtiyacımız varsa aşağıdaki şekilde nesneyi inject edebiliriz.

Constructor injection otomatik olarak gerçekleşir ancak field injection kullanıyorsak işlemi bizim tetiklememiz gerekir.

  • Field injection yöntemi ile dependency isteyen her sınıf için, Component interface’i içinde bir metot oluşturularak, dependency isteyen sınıf bu metoda parametre olarak verilir. Uygulama derlendiğinde Dagger arka planda Component arayüzünü implement eden bir sınıf oluşturur. Bu sınıf arayüz adının başına Dagger getirilerek isimlendirilir. Field injection’ın tamamlanması için bu metodun çağrılması gerekir. Bu metot çağrılana kadar dependency’ler null olurlar.

Field injection kullanıyorsak ilgili değişkenler final veya private olamazlar. Dagger2 reflection kullanmadığı için derleme zamanında bu değişkenlere erişebilmesi gerekmektedir.

Method Injection

Public bir metodun başına @Inject yazarsak metodun tüm parametreleri Dagger tarafında sağlanır.

  • Tek geçerli kullanımı, Dagger tarafından sağlanan bir dependency içine this nesnesini göndermektir. Aşağıdaki videoda Jake Wharton bundan bahsediyor.

Özetle 3 farklı injection yöntemi aşağıdaki gibi tanımlanabilir.

--

--