1

我正在将 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)是相同的。有没有一种方法可以声明让我们说一个moduleC包含FirebaseFirestore.getInstance()和的LocalDatabase.getInstance(App.sContext)然后在 and 上调用moduleAmoduleB

4

2 回答 2

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

    val moduleA = module {
    scope(named("CommonScope")) {
    
    scoped { FirebaseFirestore.getInstance() }
    scoped { LocalDatabase.getInstance(App.sContext) }
    
    scoped { NetworkDataSourceA(get()) }   
    scoped { NetworkDataSourceB(get()) }  
    
      }
    }
    
  • 现在,使用下面的行在 FragmentA 中创建您的范围。(对于 NetworkDataSourceB 的 FragmentB 也相同)

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

    commonScope.close()
    

    有关更多详细信息,请查看koin 文档(第 8 点)

于 2019-06-23T05:46:29.893 回答
0

根据 koin 文档,

默认情况下,如果在当前范围内未找到定义,则所有范围回退以在主范围内解析。

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

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

并在你的startKoin中加载这个模块,以便它在任何地方都可用。

于 2020-02-29T08:20:42.233 回答