如何绑定两个 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)是进行构造函数注入。