Koin 中的 Dagger2 提供程序
Dagger2 Provider in koin
在 koin 中是否有替代 javax.inject.Provider 的方法?
为了对操作做出反应,我正在向我的 activity 注入命令。
命令是单个 运行 对象,例如 WriteToFile.
在 dagger 中我可以这样做:
class MainPresenter : Presenter() {
@Inject
lateinit var writeFile: Provider<WriteFileCommand>
fun onSaveClicked() {
writeFile.get().run()
}
}
在 koin 中,当我尝试使用时:
class MainPresenter : Presenter() {
lateinit var writeFile: Provider<WriteFileCommand> by inject()
fun onSaveClicked() {
writeFile.get().run()
}
}
我的 koin 模块:
val appModule = module {
factory { WriteFileCommand(get(), get()) }
factory { FileProvider() }
single { DataStore() }
}
然后我收到错误提示:
Can't create definition for 'Factory [name='WriteFileCommand',class='com.test.WriteFileCommand']' due to error :
No compatible definition found. Check your module definition
我知道我可以打电话:
var command: WriteFileCommand = StandAloneContext.getKoin().koinContext.get()
command.run()
但是看起来好笨重
没有什么比直接提供者更好的了。如果您使用 inject
,您将使用惰性委托。如果您使用 get
,您将创建一个新实例,您使用 factory
声明了依赖项。所以 get
是你所需要的。只需让您的 MainPresenter
实现 KoinComponent
,您就可以直接使用 get
:
class MainPresenter : Presenter(), KoinCompontent {
fun onSaveClicked() = get<WriteFileCommand>().run()
}
在 koin 中是否有替代 javax.inject.Provider 的方法?
为了对操作做出反应,我正在向我的 activity 注入命令。 命令是单个 运行 对象,例如 WriteToFile.
在 dagger 中我可以这样做:
class MainPresenter : Presenter() {
@Inject
lateinit var writeFile: Provider<WriteFileCommand>
fun onSaveClicked() {
writeFile.get().run()
}
}
在 koin 中,当我尝试使用时:
class MainPresenter : Presenter() {
lateinit var writeFile: Provider<WriteFileCommand> by inject()
fun onSaveClicked() {
writeFile.get().run()
}
}
我的 koin 模块:
val appModule = module {
factory { WriteFileCommand(get(), get()) }
factory { FileProvider() }
single { DataStore() }
}
然后我收到错误提示:
Can't create definition for 'Factory [name='WriteFileCommand',class='com.test.WriteFileCommand']' due to error : No compatible definition found. Check your module definition
我知道我可以打电话:
var command: WriteFileCommand = StandAloneContext.getKoin().koinContext.get()
command.run()
但是看起来好笨重
没有什么比直接提供者更好的了。如果您使用 inject
,您将使用惰性委托。如果您使用 get
,您将创建一个新实例,您使用 factory
声明了依赖项。所以 get
是你所需要的。只需让您的 MainPresenter
实现 KoinComponent
,您就可以直接使用 get
:
class MainPresenter : Presenter(), KoinCompontent {
fun onSaveClicked() = get<WriteFileCommand>().run()
}