【问题标题】:Dagger injection in Base Class is a good approach?基类中的匕首注入是一种好方法吗?
【发布时间】:2020-06-03 11:47:44
【问题描述】:

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

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

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

}

在我的代码中一切正常,

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

这是正确的方法吗 注射?

谁能澄清一下?

【问题讨论】:

  • 我认为您的 lateinit var 字段将未初始化
  • @EpicPandaForce 是的,它没有初始化。
  • @EpicPandaForce 我编辑了我的示例,我使用了构造函数注入,它运行良好。
  • 通常你不应该使用字段注入,除非被某些框架强制,否则总是首选构造函数注入。
  • @Stack 你可以这样做:class Base(val dependency: Dependency), class Car @Inject constructor(dependency: Dependency): Base(dependency)

标签: android kotlin dagger-2 dagger


【解决方案1】:

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

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

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;
  }
}

如您所见,它将创建您的实例,然后访问它的字段(只要它们是公开的和可写的)。

这是正确的注入方式吗?

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

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

abstract class Vehicle(protected val default: Default)

class Car @Inject constructor(default: Default) : Vehicle(default)

这样,Dagger 将使用已经初始化的字段创建您的实例,并且不会访问它们

【讨论】:

    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多