如何处理匕首中具有多个其他依赖项的依赖项?

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 的对象,其依赖项为 HeaterPump,我们将使用以下方法:

@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, ...) { /* ... */ }

  /* ... */
}