我有一个通过构造函数注入匕首的类。但是,我现在需要向此构造函数添加一个参数,该参数不是通过注入提供的,而是一个运行时参数。
在我上一份工作中,我们滚动了自己的DI,所以我还不了解dagger提供的所有“魔术”注释。我认为向构造函数添加参数应该很简单,并且仍然可以用匕首插入剩余的值(因为使用我之前实现的上述“滚动自己的DI”解决方案非常简单)。
但是,用匕首(辅助注射)似乎无法做到这一点。因此,我一直在阅读如何解决此问题的方法,但已完全陷入困境。
这是我当前(成功地)将ServiceA
注入以下课程的课程:
class Foo @Inject constructor(private val serviceA: ServiceA) {
...
}
我想做的是向此构造函数添加另一个参数,该参数将在运行时提供。在这种情况下,可以使用一个简单的标志来确定类中的某些行为。并且,由于Dagger不支持辅助注入,因此我需要从Foo
删除注入,而是创建一个FooFactory
来处理Foo
对象的创建。该工厂将ServiceA
注入其构造函数,并将提供一种使用布尔值构造Foo
实例的方法。然后,我将得到一个Foo
类,它看起来像:
class Foo(private val serviceA: ServiceA, myNewArgument: Boolean) {
...
}
还有一个看起来像这样的FooFactory:
@Singleton
class FooFactory @Inject constructor(private val serviceA: ServiceA) {
fun createFoo(myNewArgument: Boolean) {
return Foo(serviceA, myNewArgument)
}
}
而且,尽管仅获得一个额外的构造函数arg完全是一团糟,但它确实可以完成工作。
我面临的问题是我的Foo
类实际上是一个AndroidViewModel
,并且需要通过ViewModelProvider.Factory
合约来构建,该合约具有一个create
由SDK调用以创建视图模型的方法。您可以重写此方法以创建视图模型的实例,但是该方法没有参数,因此无法通过该方法将标志传播到视图模型中。
所以让标志传播到视图模型构造函数的唯一方法是让工厂本身将标志作为其构造函数的参数,因为dagger不支持辅助注入,因此这是不可能的。 / p>
因此,我计划改为在初始化时使dagger手动将依赖项注入FooFactory
中。这就是我被困住的地方,我无法弄清楚到底是怎么获得匕首才能将依赖项手动注入到我的类中的。
我的FooFactory
现在看起来像:
class FooFactory(private val myNewArgument: Boolean) : ViewModelProvider.Factory {
init {
// I need to trigger injection here... how though???
}
@Inject
lateinit var serviceA: ServiceA
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return Foo(
serviceA,
myNewArgument
) as T
}
}
因此,以某种方式在工厂的init块中,我需要让dagger注入使用@Inject注释的字段。但是我不知道如何执行此操作,我尝试按照以下问题和教程的答案进行操作:
https://proandroiddev.com/from-dagger-components-to-manual-dependency-injection-110015abe6e0
Dagger 2 - injecting non Android classes
Dagger 2 injection in non Activity Java class
这些似乎都不适合我的用例,而我开始迷失了。有人能指出我正确的方向吗?这个Dagger框架是否由于过度设计/复杂化而没有太多好处(这是我现在要得出的结论,我要做的就是实现用于测试目的的DI,我不想写工厂,所以我可以向构造函数添加额外的参数)...