Koin在模块之间共享实例

时间:2019-06-23 04:34:30

标签: android dependencies code-injection dsl koin

我正在将Koin库用于Android项目。 我想在模块之间共享一些实例,因为在整个应用程序中它们经常被使用。 例如:

val moduleA = module {
    scope(named<FragmentA>()) {
        scoped { FirebaseFirestore.getInstance() }

        scoped { LocalDatabase.getInstance(App.sContext) }
        scoped { NetworkDataSourceA(get()) }    
    }
}

val moduleB = module {
        scope(named<FragmentB>()) {
            scoped { FirebaseFirestore.getInstance() }

            scoped { LocalDatabase.getInstance(App.sContext) }
            scoped { NetworkDataSourceB(get()) }    
        }
    }

从以下模块中可以看到,FirebaseFirestore.getInstance()LocalDatabase.getInstance(App.sContext)在两个模块之间是相同的。 有没有一种方法可以让我声明包含moduleCFirebaseFirestore.getInstance()的{​​{1}},然后在LocalDatabase.getInstance(App.sContext)moduleA上调用它? >

2 个答案:

答案 0 :(得分:0)

  • 您可以通过创建范围来做到这一点。虽然我没有尝试。

    val moduleA = module {
    scope(named("CommonScope")) {
    
    scoped { FirebaseFirestore.getInstance() }
    scoped { LocalDatabase.getInstance(App.sContext) }
    
    scoped { NetworkDataSourceA(get()) }   
    scoped { NetworkDataSourceB(get()) }  
    
      }
    }
    
  • 现在,使用下面的代码行在FragmentA中创建作用域。( FragmentB也适用于NetworkDataSourceB)

    private val commonScope = getKoin().getOrCreateScope("scope1",named("CommonScope"))
    val networkDataSourceA = commonScope.get<NetworkDataSourceA>()
    
  • 并使用onDestroy方法

    commonScope.close()
    

    有关更多详细信息,请检查koin documentation(第8点)

答案 1 :(得分:0)

根据koin文档,

默认情况下,如果在当前作用域中未找到任何定义,则所有作用域回退都将在主作用域中解决。

我建议将依赖项放在父级范围内。

val appModule = module {
     single { FirebaseFirestore.getInstance() }
     single { LocalDatabase.getInstance(App.sContext)} 
}

将此模块加载到您的 startKoin 中,以便随处可用。