Adım Adım Dagger2 / 4. Bölüm
Dagger-Android Module
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.
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.
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.
Dagger-Android modülü için örnek uygulamalar aşağıdaki bloglarda bulunabilir.
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ş:
Eğer yeni bir projeye başlarken Dagger-Android kullanarak başlamak istiyorsak aşağıdaki template’den faydalanabiliriz.