gpt4 book ai didi

android - Dagger 2 注入(inject)参数

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

我想使用 di 模式获取文件、fileOutputStreamfileIntputStream 的实例,所以我创建了一个模块并提供了所有三个依赖项,但由于文件对象需要一个我将其作为 param 传递的路径。

@Provides
File provideFile(String filePath){
return new File(filePath);
}

@Provides
FileOutputStream provideFileOutputStream(String filePath){
return new FileIntputStream(provideFile(filePath));
}

@Provides
FileIntputStream provideFileIntputStream(String filePath){
return new FileIntputStream(provideFile(filePath));
}

然后我得到了以下错误:

"@inject constructor or from an @provides-annotated method. java.lang.string is injected"

根据一些研究,我遇到了“Newables”、“Injectables”的概念,因为字符串是一个新的,即它没有固定的实现,我们需要手动调用它,如果它无法推断,那么有很多要使用哪个对象,所以我的问题是 di 是否可以仅用于创建其 params 在编译时已知的对象,如果是这样的话,创建具有静态/固定参数的对象有什么意义.

最佳答案

您对 DI 的理解有点错误。 DI 不接受参数,尤其是 Dagger——它是一个编译时实现。 DI 提供程序的唯一合法参数是其他注入(inject)变量。如果您无论如何都必须提供路径,那么注入(inject)文件绝对是 0 点——此时只需调用 new 即可。

如果您想获取特定文件,您将使用注入(inject)的地方 - 让我们说一下您的主数据库的文件。那么你会:

@Provides
File provideFile(){
return new File("/my/path);
}

至于 DI 的意义是什么 - 有两个。一个是它用于范围变量。另一个是使测试更容易——通过注入(inject)变量而不是访问单例,您可以轻松地放入部分实现、模拟或纯测试实现。它还可以轻松切换抽象接口(interface)的实现,包括整个子系统 - 只需切换您添加的子组件即可。

(顺便说一句,如果你想你可以注入(inject)一个字符串路径,我在我当前应用程序的几个地方这样做了。但是你必须使用@Named所以你可以告诉注入(inject)哪个字符串。任何时候你想注入(inject)都是如此某种类型的超过 1 个实例)。

关于android - Dagger 2 注入(inject)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45152412/

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