Koin:如何降低模块的可见性(私有非导出模块)

3
我正在使用 Koin 3.2 版本,该版本具备了新的模块包含特性。在官方文档中,在讨论模块链接策略时,有以下这段话:

值得注意的一点是:您可以使用 includes 添加内部和私有模块,从而灵活地控制在模块化项目中暴露哪些内容。

这正是我所需要的,然而我没有找到其他文档中如何设置“私有”模块的方法,该模块仅为父模块提供依赖项,以便这些子依赖项不可用于注入。例如:
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?


你最终找到正确的方法了吗? - alGhul7
2个回答

1
据我所知,这个新的includes特性只是让整个模块定义成为privateinternal,不允许你将它们包含到此范围之外的模块中。我想这更多地与控制在大型模块化项目中创建Koin模块有关,而不是能够控制开发人员可以注入什么或不能注入什么。
private val privateModule = module {
   singleOf(::SomeNonInjectableClass)
} 

我可以理解将此私有化以其范围可以避免在创建跨不同Kotlin模块的大型koin模块组合时产生某些混淆(特别是如果私有模块中有很多定义),但同时我也感到沮丧,因为似乎无法实现您想要做的事情。


1

澄清一下:includes运算符允许加载带有给定模块的其他模块。

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


但我不想分享任何东西。例如:想象一个领域服务模块导入了一个数据库模块。我不希望项目中的任何人绕过领域服务模块使用数据库模块。 - Mister Smith
注入可见性与编译可见性相关联。如果您无法访问该类,则无法进行注入。 - Arnaud Giuliani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接