Bladeren bron

add DI for app

MrOzOn 5 jaren geleden
bovenliggende
commit
9b8f72c60f

+ 2 - 0
app/build.gradle

@@ -40,6 +40,8 @@ android {
 apply from: "$project.rootDir/scripts/deps_versions.gradle"
 
 dependencies {
+    api project(':core_api')
+    implementation project(':core')
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
     //DAGGER
     implementation dagger

+ 11 - 7
app/src/main/java/com/mrozon/healthdiary/App.kt

@@ -1,14 +1,21 @@
 package com.mrozon.healthdiary
 
 import android.app.Application
+import com.mrozon.core_api.providers.AppWithFacade
+import com.mrozon.core_api.providers.ProvidersFacade
+import com.mrozon.healthdiary.di.FacadeComponent
 import timber.log.Timber
 
-class App: Application() {
+class App: Application(), AppWithFacade {
+
+    companion object {
+        private var facadeComponent: FacadeComponent? = null
+    }
 
     override fun onCreate() {
         super.onCreate()
         initTimber()
-        initDagger()
+        (getFacade() as FacadeComponent).inject(this)
     }
 
     private fun initTimber() {
@@ -16,11 +23,8 @@ class App: Application() {
             Timber.plant(Timber.DebugTree())
     }
 
-    private fun initDagger() {
-//        DaggerAppComponent.builder()
-//            .application(this)
-//            .build()
-//            .inject(this)
+    override fun getFacade(): ProvidersFacade {
+        return facadeComponent ?: FacadeComponent.init(this).also { facadeComponent = it }
     }
 }
 

+ 39 - 0
app/src/main/java/com/mrozon/healthdiary/di/AppComponent.kt

@@ -0,0 +1,39 @@
+package com.mrozon.healthdiary.di
+
+import android.app.Application
+import android.content.Context
+import com.mrozon.core_api.providers.AppProvider
+import dagger.BindsInstance
+import dagger.Component
+import javax.inject.Singleton
+
+@Singleton
+@Component(
+    modules = []
+)
+interface AppComponent: AppProvider {
+
+    companion object {
+
+        private var appComponent: AppProvider? = null
+
+        fun create(application: Application): AppProvider {
+            return appComponent ?: DaggerAppComponent
+                .builder()
+                .application(application.applicationContext)
+                .build().also {
+                    appComponent = it
+                }
+        }
+    }
+
+    @Component.Builder
+    interface Builder {
+
+        @BindsInstance
+        fun application(context: Context): Builder
+
+        fun build(): AppComponent
+    }
+
+}

+ 28 - 0
app/src/main/java/com/mrozon/healthdiary/di/FacadeComponent.kt

@@ -0,0 +1,28 @@
+package com.mrozon.healthdiary.di
+
+import android.app.Application
+import com.mrozon.core.CoreProvidersFactory
+import com.mrozon.core_api.db.DatabaseProvider
+import com.mrozon.core_api.network.NetworkProvider
+import com.mrozon.core_api.providers.AppProvider
+import com.mrozon.core_api.providers.ProvidersFacade
+import com.mrozon.healthdiary.App
+import dagger.Component
+
+@Component(
+    dependencies = [AppProvider::class, DatabaseProvider::class, NetworkProvider::class]
+)
+interface FacadeComponent : ProvidersFacade {
+
+    companion object {
+
+        fun init(application: Application): FacadeComponent =
+            DaggerFacadeComponent.builder()
+                .appProvider(AppComponent.create(application))
+                .databaseProvider(CoreProvidersFactory.createDatabaseBuilder(AppComponent.create(application)))
+                .networkProvider(CoreProvidersFactory.createNetworkBuilder())
+                .build()
+    }
+
+    fun inject(app: App)
+}

+ 6 - 0
core_api/src/main/java/com/mrozon/core_api/providers/AppWithFacade.kt

@@ -0,0 +1,6 @@
+package com.mrozon.core_api.providers
+
+interface AppWithFacade {
+
+    fun getFacade(): ProvidersFacade
+}

+ 6 - 0
core_api/src/main/java/com/mrozon/core_api/providers/ProvidersFacade.kt

@@ -0,0 +1,6 @@
+package com.mrozon.core_api.providers
+
+import com.mrozon.core_api.db.DatabaseProvider
+import com.mrozon.core_api.network.NetworkProvider
+
+interface ProvidersFacade : NetworkProvider, DatabaseProvider, AppProvider