gpt4 book ai didi

android - 将依赖项注入(inject)未打包的对象 - 最佳实践?

转载 作者:行者123 更新时间:2023-11-29 17:22:55 25 4
gpt4 key购买 nike

我有一个域实体 - 假设它是一个 Car - 它包含一个我通过 Dagger 注入(inject)的存储库实现。当我测试我的实体时,我将存储库换成模拟实现。 Car实现了 Parcelable

Dagger 可以在 Car(Engine) 被调用时构造对象,但是当 Car(Parcel) 被调用时它显然无法执行,因为它是由Parcelization Framework(通常在从 Intent 获取 Car 时)。

Car(Parcel) 构造函数中手动注入(inject)依赖项是个好主意吗?或者,是否有您可以推荐的最佳实践?在 Parcel 构造函数中注入(inject)依赖项肯定会解决我的问题,但建议不要在构造函数中注入(inject)依赖项,以保持实例化和注入(inject)逻辑之间的关注点分离。

这是我的域实体

public class Car implements Parcelable {

@Inject ICarRepository CarRepositoryImpl;

private Engine engine; // User specified engine passed through constructor

public Car(Engine engine) {
this.engine = engine;
}

public Car(Parcel parcel) {
this.engine = getEngine(parcel); // Read engine from parcel
// Inject dependencies here?
}

// Static Parcelable creator and other methods follow...
}

最佳答案

David 对您的问题的评论很到位 - 为什么 Car 会依赖于 CarRepository?这肯定是一种反模式——存储库用于将实体与建模/持久性分离;在这里,您似乎毫无理由地介绍了一个。但是,让我们暂时假设您只是为了举例而将存储库放在那里。

当然,Dagger 没有自动准备对象的方法,一旦它被解包。这意味着,我们必须在某个地方调用 Dagger。

根据我的判断,合适的候选人是您的 public static final Parcelable.Creator CREATOR,如下所示:

// Creator
public static final Parcelable.Creator<Car> CREATOR
= new Parcelable.Creator<>() {
public Car createFromParcel(Parcel in) {
Car ret = new Car(in);
DaggerCarComponent.builder().build().inject(ret);
return ret;
}
};

使用此技术实现的目标

  • 您的特定于 Dagger 的代码不会与构造函数中的实例化逻辑纠缠在一起,而是作为拆包的特定实现。
  • 您的 Dagger 特定代码是静态的,可以单独测试,而无需通过 Parcel 实例化 Car
  • 通过使用 @Component,您的代码不仅可以抵抗 future 的更改(例如添加或删除依赖项),而且可以极简/DRY

关于android - 将依赖项注入(inject)未打包的对象 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35927891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com