【问题标题】:Provide all childs of a class with dagger为班级的所有孩子提供匕首
【发布时间】:2019-11-14 04:15:42
【问题描述】:

我正在创建一个高度模块化的应用程序,我有很多需要注入的类,它们都是同一个类的子(不是直接子),它们都没有构造函数参数。

我想避免在我的模块中为它们中的每一个创建一个“@Provides”方法。

有没有办法告诉 dagger 自动提供所有实现基接口的类?还是可以自己使用反射来完成?

我在 kotlin 中使用 dagger-android

更新:我会发布一些代码来说明

在其中一个模块中我有这个界面

interface ExampleClass: BaseExample {

    fun doSomething()

    }
}

然后在主应用中实现它

class ExampleClassImpl @Inject constructor() : ExampleClass { 
    override fun doSomething(){
    }
}

我需要它的类是使用 dagger 创建的 Viewmodel,因此注入适用于构造函数。

class ExampleViewModel @Inject constructor(val exmpl :ExampleClass) : BaseViewModel { 

}

我想注入那个 ExampleClassImpl,为此我需要创建一个带有 @Provides 或 @Bind 注释的方法的 @module 并返回该类。

如果没有提供程序,我会在编译时出错:

错误:[Dagger/MissingBinding] com.myapp.ExampleClassImpl 不能在没有@Provides-annotated 方法的情况下提供。

【问题讨论】:

  • 为什么需要为每个方法创建一个@Provides 方法?你不能用@Inject注释每个类构造函数还是我错过了什么?
  • 我已经在构造函数上有@Inject,但我仍然需要匕首来提供这些类
  • 如果您在每个子类构造函数中都有@Inject,那么 Dagger 将自动提供这些类。你不需要@Provides 方法。
  • 这似乎不对,如果我删除“@Provides”方法,我会得到:[Dagger/MissingBinding] com.myapp.ExampleClass 不能在没有“@Provides-annotated”方法的情况下提供。
  • 假设ExampleClass 是一个具体的类,你在注释它的构造函数吗?请发布一些代码,以便我们了解您在做什么。

标签: android kotlin dagger


【解决方案1】:

你想注入ExampleClass,但Dagger只知道ExampleClassImpl。 Dagger 怎么知道你想要那个特定的子类?
此外,您说您有 许多 个要注入的子类。 Dagger 怎么知道向期望基类的构造函数提供哪个?

如果您希望ExampleViewModel 获得ExampleClassImpl 的实例,那么您只需将声明更改为:

class ExampleViewModel @Inject constructor(val exmpl :ExampleClassImpl)

这样做您将失去将构造函数参数与ExampleClass 的不同实现交换的能力。

另一种方法是每个子类有一个@Named @Provides 方法。所以像:

// In your module
@Provides
@Named("impl1")
fun provideExampleClassImpl1(impl: ExampleClassImpl): ExampleClass = impl
// When using the named dependency
class ExampleViewModel @Inject constructor(@Named("impl1") val exmpl :ExampleClass)

【讨论】:

  • 感谢您的回答,但视图模型位于不同的模块中,并且不了解实现,而替代方法实际上是创建提供程序,这正是我想要避免的。所以我唯一的选择是告诉 dagger 在我的模块中自动提供从 BaseExample 接口继承的所有类
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2023-04-06
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多