在iOS(KMM)中使用Koin进行依赖注入



我在KMM项目中使用Koin。在安卓系统上,它可以正常工作,但在iOS上,我必须为我想要注入的每个组件创建一个包装器,类似于这样(Logger组件为例(:

inline fun <reified T> getKoinInstance() =
object : KoinComponent {
val value: T by inject()
}.value
object LoggeriOS {
private val logger = getKoinInstance<Logger>()
fun logger() = logger
}

然后我可以在iOS上这样做:

let logger = LoggeriOS.shared.logger()
logger.i(msg: "Hello World")

问题:没有专门针对iOS的包装类,还有更好的方法吗?

您可以从kmm模块直接为Koin类提供扩展,然后在ios端直接使用它们。

步骤1定义内部kmm ios模块的扩展

val Koin.logger: Logger
get() = get() // second get() is from koin

步骤2

然后定义从ios端启动koin的方法,koin.swift文件并保存koin 的全局实例

func startKoin() {
let koinApplication = DependencyInjectionKt.doInitKoinIOS()
// _koin is Koin instance
_koin = koinApplication.koin
}

//koin is a global instance of Koin, use it to get dependencies
private var _koin: Koin_coreKoin? = nil
var koin: Koin_coreKoin {
return _koin!
}

步骤3然后在iosApp.swift文件

@main
struct iOSApp: App {
init() { startKoin()  }
} 

然后你可以在任何地方使用koin.swift的koin实例,就像这个一样

koin.logger // this will use the extension you defined in kmm module in first step and will provide you Logger

最新更新