如何处理匕首中具有多个其他依赖项的依赖项?
How to handle a dependency with multiple other dependeccies in dagger?
我目前正在将 dagger 引入 android 应用程序。我有点担心设计方面,我想知道是否有更好的方法来处理它。让我们用 here 提供的例子来说明这个问题。考虑以下模块;
@Module
class DripCoffeeModule {
@Provides Heater provideHeater() {
return new ElectricHeater();
}
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
}
在这里,很容易看出泵的创建取决于 Thermosiphon
,因此,它在 providePump
方法中作为 arg 提供。同样,如果我们希望 DripCoffeeModule
模块能够提供类型为 C
的对象,其依赖项为 Heater
和 Pump
,我们将使用以下方法:
@Provides
C provideC(Heater heater, Pump pump){
C wantedC = applyMagic(heater, pump)
return c
}
如果 provideC
方法有 16 个(或任何大量的)依赖项,它会有 16 个或更多的参数吗?有没有更好的办法处理这种情况?
在那种情况下,我认为您 C
的设计存在缺陷。来自 IntelliJ IDEA Code Inspections List:
Overly Coupled Class
This inspection reports any instances of classes which are highly
coupled, i.e. that reference too many other classes. Classes with too
high a coupling can be very fragile, and should probably be broken up.
因此,您不希望 C
class 有 16 个依赖项,但您希望它有 ~2-3-4 个依赖项,而这又依赖于一小部分classes.
如果你真的想要很多依赖,你可以用@Inject
注释构造函数。那么@Provides C provideC(...)
方法就不需要了:
public class C {
@Inject
public C(Object arg1, Object arg2, Object arg3, ...) { /* ... */ }
/* ... */
}
我目前正在将 dagger 引入 android 应用程序。我有点担心设计方面,我想知道是否有更好的方法来处理它。让我们用 here 提供的例子来说明这个问题。考虑以下模块;
@Module
class DripCoffeeModule {
@Provides Heater provideHeater() {
return new ElectricHeater();
}
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
}
在这里,很容易看出泵的创建取决于 Thermosiphon
,因此,它在 providePump
方法中作为 arg 提供。同样,如果我们希望 DripCoffeeModule
模块能够提供类型为 C
的对象,其依赖项为 Heater
和 Pump
,我们将使用以下方法:
@Provides
C provideC(Heater heater, Pump pump){
C wantedC = applyMagic(heater, pump)
return c
}
如果 provideC
方法有 16 个(或任何大量的)依赖项,它会有 16 个或更多的参数吗?有没有更好的办法处理这种情况?
在那种情况下,我认为您 C
的设计存在缺陷。来自 IntelliJ IDEA Code Inspections List:
Overly Coupled Class
This inspection reports any instances of classes which are highly coupled, i.e. that reference too many other classes. Classes with too high a coupling can be very fragile, and should probably be broken up.
因此,您不希望 C
class 有 16 个依赖项,但您希望它有 ~2-3-4 个依赖项,而这又依赖于一小部分classes.
如果你真的想要很多依赖,你可以用@Inject
注释构造函数。那么@Provides C provideC(...)
方法就不需要了:
public class C {
@Inject
public C(Object arg1, Object arg2, Object arg3, ...) { /* ... */ }
/* ... */
}