主函数中的 Dagger 依赖注入
Dagger Dependency Injection in main function
我在 class S3FileOperationsAdapter 中从我的 kotlin 代码中的主函数调用一个函数。我在主函数文件中注入 class S3FileOperationsAdapter。所以看起来像
class Runner {
@set:Inject
lateinit var s3FileOperationsAdapter: S3FileOperationsAdapter
fun main(args: Array<String>) {
s3FileOperationsAdapter.readFunction()
}
}
现在的问题是:
- 当我尝试 运行 上述代码时,出现错误
Error: Main method is not static in class com.amazon.bram.sim.BatchJobRunner, please define the main method as:
。这是可以理解的。
而且我们只能在kotlin的一个对象中做一个静态函数。因此,这样做后,我无法注入依赖项,因为 Dagger does not support injection into Kotlin objects
。所以感觉像死锁。
我的问题是,无论如何我都想在这个文件中注入依赖项,以便我可以调用相应的函数。我从 kotlin 中的“fun main()”调用这个函数。我怎样才能做到这一点?有没有人遇到过这个问题?
为了在 Dagger 中注入任何东西,您必须首先创建一个组件实例。由于根本没有代码会在 fun main()
之前 运行,这需要在 main
本身期间(或在字段初始化程序中)完成。
创建组件的实例后,您可以直接向它请求S3FileOperationsAdapter
的实例。
fun main(args: Array<String>) {
// Create the component.
val component = DaggerMyComponent.create()
// or use the Component.Builder or Component.Factory you defined for MyComponent.
// Get an object from the component.
// This method should be defined in your component interface.
val adapter = component.s3FileOperationsAdapter()
// Use the object.
adapter.readFunction()
}
如果您的实际代码更复杂,有多个注入对象和更长的 main()
函数,这可能有点笨拙。在这种情况下,您可以将当前的 main()
提取到它自己的 class 中,并让 Dagger 在 main()
.
中提供 class
我在 class S3FileOperationsAdapter 中从我的 kotlin 代码中的主函数调用一个函数。我在主函数文件中注入 class S3FileOperationsAdapter。所以看起来像
class Runner {
@set:Inject
lateinit var s3FileOperationsAdapter: S3FileOperationsAdapter
fun main(args: Array<String>) {
s3FileOperationsAdapter.readFunction()
}
}
现在的问题是:
- 当我尝试 运行 上述代码时,出现错误
Error: Main method is not static in class com.amazon.bram.sim.BatchJobRunner, please define the main method as:
。这是可以理解的。
而且我们只能在kotlin的一个对象中做一个静态函数。因此,这样做后,我无法注入依赖项,因为 Dagger does not support injection into Kotlin objects
。所以感觉像死锁。
我的问题是,无论如何我都想在这个文件中注入依赖项,以便我可以调用相应的函数。我从 kotlin 中的“fun main()”调用这个函数。我怎样才能做到这一点?有没有人遇到过这个问题?
为了在 Dagger 中注入任何东西,您必须首先创建一个组件实例。由于根本没有代码会在 fun main()
之前 运行,这需要在 main
本身期间(或在字段初始化程序中)完成。
创建组件的实例后,您可以直接向它请求S3FileOperationsAdapter
的实例。
fun main(args: Array<String>) {
// Create the component.
val component = DaggerMyComponent.create()
// or use the Component.Builder or Component.Factory you defined for MyComponent.
// Get an object from the component.
// This method should be defined in your component interface.
val adapter = component.s3FileOperationsAdapter()
// Use the object.
adapter.readFunction()
}
如果您的实际代码更复杂,有多个注入对象和更长的 main()
函数,这可能有点笨拙。在这种情况下,您可以将当前的 main()
提取到它自己的 class 中,并让 Dagger 在 main()
.