如何绑定两个 kotlin 文件
How can I binding two kotlin files
我正在使用 Java 和 Kotlin 开发一个项目。
该项目最初仅在 java 中。我正在将一些 classes 迁移到 kotlin。但是我在迁移到kotlin的这个class中遇到了这个问题。此问题在配置文件中。
配置文件。
package com.fourtwenty.core
import ...
class CoreModule : AbstractModule() {
override fun configure() {
// Repositories
bind(AppRepository::class.java).to(AppRepositoryImpl::class.java)
...
// Services
bind(AuthenticationService::class.java).to(AuthenticationServiceImpl::class.java)
BindingClassImpl
package com.fourtwenty.core.services.mgmt.impl
import ...
open class AuthenticationServiceImpl @Inject constructor(token: Provider<ConnectAuthToken>) : AbstractAuthServiceImpl(token), AuthenticationService {
@Inject
private val metrcAccountRepository: MetrcAccountRepository? = null
@Inject
private val stripeService: StripeService? = null
@Inject
var integrationSettingRepository: IntegrationSettingRepository? = null
@Inject
private val shopPaymentOptionRepository: ShopPaymentOptionRepository? = null
@Inject
private val amazonServiceManager: AmazonServiceManager? = null
...
绑定类
package com.fourtwenty.core.services.mgmt
import ...
interface AuthenticationService {
fun getCurrentActiveEmployee(): InitialLoginResult?
fun adminLogin(request: EmailLoginRequest?): InitialLoginResult?
...
我在 IntellIJ 中遇到了这个错误
1) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.metrcAccountRepository cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
2) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.stripeService cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
3) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.shopPaymentOptionRepository cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
4) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.amazonServiceManager cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
5) ...
我从未使用过 Guice(我假设这是 guice,因为它没有被标记),但是出现与 spring 相同的问题,因此应该应用相同的解决方案。
字段为val
,初始化为null后无法被DI框架修改。
它们需要变成 var
以便之后可以更新。
最重要的是,您可能确定这些字段中的大部分或全部不会为空,因此可以使用 lateinit 关键字来规避冗长的可空性检查。事实上,DI 是提到的 lateinit 关键字的主要用例之一:https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables
所以它会变成:
private lateinit var metrcAccountRepository: MetrcAccountRepository
请注意,在您的情况下,如果可能的话,更简洁的替代方法(使用 val
)是进行构造函数注入。
我正在使用 Java 和 Kotlin 开发一个项目。 该项目最初仅在 java 中。我正在将一些 classes 迁移到 kotlin。但是我在迁移到kotlin的这个class中遇到了这个问题。此问题在配置文件中。
配置文件。
package com.fourtwenty.core
import ...
class CoreModule : AbstractModule() {
override fun configure() {
// Repositories
bind(AppRepository::class.java).to(AppRepositoryImpl::class.java)
...
// Services
bind(AuthenticationService::class.java).to(AuthenticationServiceImpl::class.java)
BindingClassImpl
package com.fourtwenty.core.services.mgmt.impl
import ...
open class AuthenticationServiceImpl @Inject constructor(token: Provider<ConnectAuthToken>) : AbstractAuthServiceImpl(token), AuthenticationService {
@Inject
private val metrcAccountRepository: MetrcAccountRepository? = null
@Inject
private val stripeService: StripeService? = null
@Inject
var integrationSettingRepository: IntegrationSettingRepository? = null
@Inject
private val shopPaymentOptionRepository: ShopPaymentOptionRepository? = null
@Inject
private val amazonServiceManager: AmazonServiceManager? = null
...
绑定类
package com.fourtwenty.core.services.mgmt
import ...
interface AuthenticationService {
fun getCurrentActiveEmployee(): InitialLoginResult?
fun adminLogin(request: EmailLoginRequest?): InitialLoginResult?
...
我在 IntellIJ 中遇到了这个错误
1) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.metrcAccountRepository cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
2) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.stripeService cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
3) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.shopPaymentOptionRepository cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
4) Injected field com.fourtwenty.core.services.mgmt.impl.AuthenticationServiceImpl.amazonServiceManager cannot be final.
at com.fourtwenty.core.CoreModule.configure(CoreModule.kt:1266)
5) ...
我从未使用过 Guice(我假设这是 guice,因为它没有被标记),但是出现与 spring 相同的问题,因此应该应用相同的解决方案。
字段为val
,初始化为null后无法被DI框架修改。
它们需要变成 var
以便之后可以更新。
最重要的是,您可能确定这些字段中的大部分或全部不会为空,因此可以使用 lateinit 关键字来规避冗长的可空性检查。事实上,DI 是提到的 lateinit 关键字的主要用例之一:https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables
所以它会变成:
private lateinit var metrcAccountRepository: MetrcAccountRepository
请注意,在您的情况下,如果可能的话,更简洁的替代方法(使用 val
)是进行构造函数注入。