Adım Adım Dagger2 / 4. Bölüm

Murat Karaöz
3 min readSep 10, 2018

--

Dagger-Android Module

Image from https://www.raywenderlich.com

Dagger 2.10 ile Android projelerinde injection işlemini kolaylaştıran Dagger-Android modülü yayınlanmıştır. Bu modül sayesinde injection için yazmamız gereken boiler-plate kod azalmıştır.

Önceki bölümlerde anlatılan yapı aşağıdakine görselle özetlenebilir.

Image from https://medium.com/@iammert/new-android-injector-with-dagger-2-part-2-4af05fd783d0

En üstte uygulama seviyesi singleton değerlerin tutulduğu AppComponent var. Bunun altında daha kısıtlı scope sahibi olan Activity dependency’leri tutan SubComponentlar var. Bu subcomponent’ların her biri kendi modülüne sahip. Bu ağaç aynı şekilde Fragment için aşağıya doğru uzatılabilir.

Dagger-Android ile gelen @ContributesAndroidInjector annotation’ı ile SubComponent sınıfı yaratmadan aynı işi başarabiliyoruz.

Örneğin elimizde bir LoginActivity, LoginComponent ve LoginModule olsun. Eğer LoginComponent’ı AppComponent’ın subcomponent’ı yapmak istersek AppModule içine aşağıdaki kod parçasını eklememiz yeterli.

@ContributesAndroidInjector(modules = LoginModule.class)
abstract LoginActivity loginActivity()

Eğer AppComponent’ın sub-component’ı yapmak istediğimiz birden fazla activity varsa bunları bir modül içinde gruplayıp, tek bir modül olarak AppComponent’a ekleyebiliriz. Örneğin bir ActivityBindingModule ya da ActiyibiBuilderModule yaratıp (bu modüller genelde böyle isimlendirilmiş, farklı isimlerde seçilebilir) aşağıdaki gibi AppComponent’a ekleyebiliriz.

@Singleton
@Component(modules = {
AppModule.class,
ActivityBindingModule.class})
public interface AppComponent

ActivityBindingModule de aşağıdaki gibi görünebilir.

ActivityBindingModule.java

Aynı sistem activity’e bağlı fragmentler varsa onlar içinde uygulanabilir. Örneğin HomeActivity sınıfına bağlı ProfileFragment, MovesFragment ve StatsFragment varsa Home modüle içine aşağıdaki şekilde bu fragmentleri ekleyebiliriz.

Bu örneğin Application-Activity örneğinden farkı subcomponentların gruplanmadan tek tek eklenmiş olması.

Scope ve @ContributesAndroidInjector

Eğer @ContributesAndroidInjector ile oluşturduğumuz hiyerarşide custom-scope kullanmak istersek, oluşturduğumuz scope’u @ContributesAndroidInjector ile beraber abstract metodun üzerine ekleyebiliriz.

@ContributesAndroidInjector(modules = LoginModule.class)
@ActivityScope
abstract
LoginActivity loginActivity();

Bu durumda @ContributesAndroidInjector sayesinde arka planda oluşturulan subcomponent verdiğimiz scope ile oluşturulur.

Özetle @ContributesAndroidInjector sayesinde üstteki görselde ifade edilen yapı aşağıdaki gibi sadeleştirilebilir.

Image from Mert Şimşek

Dagger-Android modülünü ve MVVM paterni ile android arch. components kullanarak yazdığım aşağıdaki uygulama Bitfinex Api sine bağlanarak BTC fiyatını çekiyor ve kullanıcıya gösteriyor.

Daha kapsamlı bir örnek uygulama Mindorks tarafından geliştirilmiş:

--

--