【问题标题】:Provide an Instance as its interface in Koin在 Koin 中提供一个 Instance 作为其接口
【发布时间】:2019-09-06 06:06:53
【问题描述】:

假设我有两个接口,例如:

interface LetterClassifier
interface NumberClassifier

然后这些接口将应用于这个类:

class Classifier() : LetterClassifier, NumberClassifier

现在,我只想以LetterClassifierNumberClassifier 的形式提供这些实例,而不是Koin 中的Classifier

我认为这样做的方式是:

module {
    val classifier = Classifier()

    single<NumberClassifier> { classifier }
    single<LetterClassifier> { classifier }
}

但我认为这不是正确的方法。有人可以指导我吗?

【问题讨论】:

    标签: kotlin koin


    【解决方案1】:

    您可以将类型绑定到您的定义中,就像official article 中描述的那样:

    single { Classifier() } binds arrayOf(LetterClassifier::class, NumberClassifier::class)
    

    如果您想完全排除 Classifier 类型,您可以执行以下操作:

    single<LetterClassifier> { Classifier() } bind NumberClassifier::class
    

    【讨论】:

      【解决方案2】:

      你这样做的方式实际上是正确的方式!这是另一个例子from the Koin docs,做同样的事情:

      class DataRepository()
      interface Presenter
      class MyPresenter(val repository : Repository) : Presenter
      
      val myModule = module {
          // Define a singleton for type  DataRepository
          single { DataRepository() }
      
          // Define a factory (create a new instance each time) for type Presenter (infered parameter in <>) 
          // Resolve constructor dependency with get()
          factory<Presenter> { MyPresenter(get()) }
      }
      

      执行此操作时需要注意的一件小事:您的方法在处理模块声明时立即创建一个实例,而将构造函数调用放在 single lambdas 将在需要时创建实例:

      single<NumberClassifier> { Classifier() }
      single<LetterClassifier> { Classifier() }
      

      虽然这为这两个接口创建一个单独的实例。

      【讨论】:

      • 但我是同一个实例。可以在不立即创建实例的情况下这样做吗?还是我应该简单地使实例化变得惰性,以便立即创建它?
      【解决方案3】:

      你可以有一个函数或一个单例来提供实例,

      single<NumberClassifier> { Singleton.createClassifier() }
      single<LetterClassifier> { Singleton.createClassifier() }
      

      【讨论】:

      • 这不是一个好主意。您将为 1 个实例定义 3 个单例。选择的答案是正确的答案。
      猜你喜欢
      • 2020-06-03
      • 1970-01-01
      • 2015-06-27
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      相关资源
      最近更新 更多