【问题标题】:Koin: how to reduce the visibility of modules (private non-exported modules)Koin:如何降低模块的可见性(私有非导出模块)
【发布时间】:2022-08-22 22:59:23
【问题描述】:

我正在使用具有新模块包含功能的 Koin 3.2。在official docs中,在讨论模块链接策略时,有这么一段:

需要注意的一个重要细节是,您也可以使用包含来添加内部和私有模块 - 这使您可以灵活地在模块化项目中公开哪些内容。

这正是我所需要的,但我无法在文档的其他地方找到如何设置一个只为父模块提供依赖项的“私有”模块,这样那些子依赖项就不能用于注入。例如。:

class SomeNonInjectableClass
class SomeInjectableClass(private val sni : SomeNonInjectableClass)

val privateModule = module {
    singleOf(::SomeNonInjectableClass)
}

val publicModule = module {
    includes(privateModule)
    singleOf(::SomeInjectableClass)
}

在我的主应用程序中,我只列出了公共模块,但 Koin 自动提供了所有包含的模块:

startKoin{
    androidLogger()
    androidContext(this@Main)
    modules(publicModule)
}

所以现在开发人员可以从任何活动中做到这一点:

val foo : SomeInjectableClass by inject() //Ok
val bar : SomeNonInjectableClass by inject() //I don\'t want this

我希望开发人员不能从私有模块中注入不可注入的类。类似于 Dagger 2 的 @NonInjectable 标记限定符。

这是可能的还是我应该求助于使用经典 DSL 手动构建我的定义?

    标签: android kotlin dependency-injection koin


    【解决方案1】:

    据我了解,这个新的includes 功能只是使整个模块定义成为可能privateinternal,不允许您将它们包含在此范围之外的模块中。我想这更多地与控制大型模块化项目中 Koin 模块的创建有关,而不是能够控制开发人员可以或不能注入的内容。

    private val privateModule = module {
       singleOf(::SomeNonInjectableClass)
    } 
    

    我可以理解如何在跨不同 kotlin 模块(特别是私有模块中有很多定义)创建大量 koin 模块组合时,将其设为私有可以避免一些混淆,但同时我也很沮丧似乎不可能实现您想要做的事情。

    【讨论】:

      【解决方案2】:

      澄清一下:includes 操作员允许使用给定模块加载其他模块。

      如果您想避免共享内部实现,请检查您的 Gradle 模块暴露情况。例如,仅共享接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多