在基类中注入 Dagger 是一个好方法吗?

Sta*_*ack 4 android kotlin dagger dagger-2

我有一个Car扩展类的类Vehicle,我将在车辆类中注入一些属性。
示例 编辑

abstract class Vehicle {
    @Inject
    lateinit var default: Default
}

class Car @Inject constructor(): Vehicle() {

}

Run Code Online (Sandbox Code Playgroud)

在我的代码中一切正常,

但我需要知道的一件事是,匕首如何将属性注入基类或其层次结构中?

这是正确的注射方式吗?

谁能澄清这一点吗?

GV_*_*Qst 6

但我需要知道的一件事是,匕首如何将属性注入基类或其层次结构中?

为此,您可以查看生成的源文件。在你的情况下会有类似的事情:

class Car_Factory implements Factory<Car> {

  @Override
  public Car get() {
    return provideInstance(
      defaultProvider
    );
  }

  public static Car provideInstance(
    Provider<Default> defaultProvider
  ) {
    Car instance = new Car();

    Vehicle_MembersInjector.injectDefault(instance, defaultProvider.get()); // just instance.default = default here
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它将创建您的实例,然后访问它的字段(只要它们是公共且可写的)。

这是正确的注射方式吗?

不建议这样做,因为您公开了可能是私有(或受保护)的字段,并且允许外部其他人进行修改,这违反了封装。

因此,最好以这种方式使用构造函数注入:

abstract class Vehicle(protected val default: Default)

class Car @Inject constructor(default: Default) : Vehicle(default)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,Dagger 将使用已初始化的字段创建您的实例,并且不会访问它们