gpt4 book ai didi

android - 如何使用 Dagger 为构造函数注入(inject)提供自定义依赖项

转载 作者:行者123 更新时间:2023-11-29 16:34:30 24 4
gpt4 key购买 nike

我有我要注入(inject)的 NetworkDataSource。我想使用构造函数注入(inject),因为我是这个类的所有者:

 public class NetworkDataSource {

@Inject
public NetworkDataSource(String url, String method) {
this.url = url;
this.method = method;
}
}

问题在于,当 BroadcastIntent 被触发时,此构造函数的参数(即依赖项)作为附加项从 Service 中检索。所以我的问题是,如何将从 Service 检索到的这些参数提供给我的 NetworkDataSource 构造函数注入(inject)?

服务如下所示:

public class Service extends IntentService {

// I would like to inject NetworkDataSource
//@Inject
//NetworkDataSource netWorkDataSource;

public String url;
public String method;

@Override
protected void onHandleIntent(Intent workIntent) {
url = workIntent.getStringExtra("url");
method = workIntent.getStringExtra("method");
}

............
............

networkDataSource.myMethod();
}

谢谢。

最佳答案

这是一个棘手的问题,因为您认为 Dagger 主要解决了现在您不再需要引入“工厂”类来重新配置行为的问题。

但是,您实际上仍然需要使用“工厂”类来创建具有在运行时获取的动态构造函数参数的对象

所以:

 public class NetworkDataSource {

@Inject
public NetworkDataSource(String url, String method) {
this.url = url;
this.method = method;
}
}

会是

@Singleton
public class NetworkDataSourceFactory {
private final OkHttpClient okHttpClient;
private final Gson gson;

@Inject
public NetworkDataSourceFactory(OkHttpClient okHttpClient, Gson gson) {
this.okHttpClient = okHttpClient;
this.gson = gson;
}

public NetworkDataSource create(String url, String method) {
return new NetworkDataSource(okHttpClient, gson, url, method);
}
}

然后现在您可以注入(inject) NetworkDataSourceFactory,并在收到参数时创建一个 NetworkDataSource:

@Inject NetworkDataSourceFactory factory;

....
networkDataSource = factory.create(url, method);

据说您可以使用 AutoFactory 来帮助创建工厂,但我还没有使用它,我所知道的是它存在于这个特定的用例中。

编辑:您还可以查看 https://github.com/square/AssistedInject帮助解决这个问题。

关于android - 如何使用 Dagger 为构造函数注入(inject)提供自定义依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52858354/

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