当前位置: 首页 > 知识库问答 >
问题:

在单个私有构造函数类上使用刀柄进行依赖注入

薛欣荣
2023-03-14

我是新手。所以我想在我的使用MVVM架构的项目上尝试依赖注入。结构如下:JsonHelper-

当我试图在RemoteDataSource和Repository上注入DI时,出现了问题,因为这些类是单例类,并且有一个私有构造函数。错误代码如下所示

..location\RemoteDataSource.java:40: error: Dagger does not support injection into Kotlin objects
public static final class Companion {

..location\Repository.java:30: error: Dagger does not support injection into Kotlin objects
public static final class Companion {

这是我的远程数据源和存储库代码,我已经尝试将其注入构造函数,但它说Dagger不能注入私有构造函数,所以我尝试将其注入函数,但仍然不起作用

远程数据源. kt

@Singleton
class RemoteDataSource private constructor(private val jsonHelper: JsonHelper) {

companion object {

    @Volatile
    private var instance: RemoteDataSource? = null

    @Inject
    fun getInstance(jsonHelper: JsonHelper): RemoteDataSource =
        instance ?: synchronized(this) {
            instance ?: RemoteDataSource(jsonHelper).apply { instance = this }
        }

}

fun getAllRemoteMovies(moviesCallback: LoadMoviesCallback) {
    moviesCallback.onAllMoviesReceived(jsonHelper.loadRemoteMovies())
}

fun getAllRemoteTVShows(tvshowCallback: LoadTVShowCallback) {
    tvshowCallback.onAllTVShowsReceived(jsonHelper.loadRemoteTVShows())
}

interface LoadMoviesCallback {
    fun onAllMoviesReceived(moviesResponses: ArrayList<MovieItem>)
}

interface LoadTVShowCallback {
    fun onAllTVShowsReceived(tvshowResponses: ArrayList<TVShowItem>)
}

}

Repository.kt

@Singleton
class Repository private constructor(private val remoteDataSource: RemoteDataSource) : DataSource {

companion object {

    @Volatile
    private var instance: Repository? = null

    @Inject
    fun getInstance(remoteDataSource: RemoteDataSource): Repository =
        instance ?: synchronized(this) {
            instance ?: Repository(remoteDataSource).apply { instance = this }
        }

}

override fun getAllRemoteMovies(): LiveData<ArrayList<MovieItem>> {
    val remoteMoviesResult = MutableLiveData<ArrayList<MovieItem>>()
    remoteDataSource.getAllRemoteMovies(object : RemoteDataSource.LoadMoviesCallback {
        override fun onAllMoviesReceived(moviesResponses: ArrayList<MovieItem>) {
            remoteMoviesResult.value = moviesResponses
        }
    })
    return remoteMoviesResult
}

override fun getAllRemoteTVShows(): LiveData<ArrayList<TVShowItem>> {
    val remoteTVShowsResult = MutableLiveData<ArrayList<TVShowItem>>()
    remoteDataSource.getAllRemoteTVShows(object : RemoteDataSource.LoadTVShowCallback {
        override fun onAllTVShowsReceived(tvshowResponses: ArrayList<TVShowItem>) {
            remoteTVShowsResult.value = tvshowResponses
        }
    })
    return remoteTVShowsResult
}

}

这是我的注入模块RemoteDataSourceModule.kt

@Module
@InstallIn(ActivityComponent::class)
object RemoteDataSourceModule {

@Singleton
@Provides
fun provideJsonHelper(context: Context): JsonHelper {
    return JsonHelper(context)
}

@Singleton
@Provides
fun provideRemoteDataSource(jsonHelper: JsonHelper): RemoteDataSource {
    return RemoteDataSource.getInstance(jsonHelper)
}

@Singleton
@Provides
fun provideRepository(remoteDataSource: RemoteDataSource): Repository {
    return Repository.getInstance(remoteDataSource)
}

}

那么不把类构造函数改成public怎么解决这个问题呢?

共有1个答案

欧阳声
2023-03-14

@Singleton注释足以通知该类是一个Singleton类,因此我只需删除伴随对象,并将私有构造函数更改为公共构造函数,代码将如下所示:

@Singleton
class RemoteDataSource @Inject constructor(private val jsonHelper: JsonHelper) {
    // Your codes
}
 类似资料:
  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 我有一个自定义类,它有一个参数化构造函数 因此,实例化时需要3个参数。如果我想将这个类作为依赖项添加,我发现在Spring中没有直接的方法可以做到这一点。 我知道我可以简单地创建一个类的新实例并使用它的方法。但是我找不到任何直接的方法将这个类注入我的另一个类,即Rest控制器。 需要注意的是:所有3个参数都需要在运行时传递。我不能从属性文件中使用它们 即使Spring中没有直接的方法,我也想知道定

  • 问题内容: 我有下面的构造函数的文本编辑器类 在春豆中,我有 我观察到的是带有两个参数的构造函数,称为一致。它是随机的吗?是否应该不抛出弹簧异常,因为它不知道需要调用哪个构造函数? 问题答案: 这是Spring自动装配构造函数的结果。 它要做的第一件事是获取所有bean类的构造函数并对它们进行排序,首先将公共构造函数的参数数量减少,然后再将所有非公共构造函数的参数数量减少。这些是候选构造函数。 然

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 问题内容: 假设我们有以下代码: 当我们创建一个对象时,该对象最初称为父类构造函数。但是就像私人的一样- 我们收到一个错误。一个好的例子和解决这个问题的方法是多少? 问题答案: 没有出路。你必须创建一个可用的(,或默认)的超级构造函数能够延长。 这种表示法通常用于实用程序类或单例中,在这种情况下,您不希望用户通过扩展实例和实例化子类,或者只是通过调用类的构造函数来自己创建类的实例。 当您只有一个具