我想使用di模式获得文件、fileOutputStream、fileIntputStream的一个实例,所以我创建了一个模块并提供了所有三个依赖项,但由于文件对象需要路径,所以我将其作为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“的概念,因为string是一个newable,也就是说它没有固定的实现,我们需要手动调用它,如果它不能推断使用哪个对象,那么我的问题是,di只能用于创建其params在编译时是已知的对象,如果是这样,那么它的意义仅仅是创建具有静态/固定参数的对象。
发布于 2017-07-18 04:00:06
你对DI的想法有点错误。DI不带参数,尤其是Dagger-它是一个编译时实现。DI提供程序的唯一合法参数是其他注入变量。如果你无论如何都要提供路径,那么注入一个文件是绝对没有意义的--只要在这一点上调用new即可。
如果你想获得一个特定的文件,你可以使用注入--比如说你的主数据库的文件。然后你就会有:
@Provides
File provideFile(){
return new File("/my/path);
}至于DI的意义是什么--有几个。其一是它用于变量的作用域。另一种是使测试更容易-通过注入变量而不是访问单例,您可以轻松地放入部分实现、模拟或纯测试实现中。它还可以很容易地切换出抽象接口的实现,包括整个子系统-只需切换您添加的子组件。
(顺便说一句,如果你愿意,你可以注入一个字符串路径,我在我当前的应用程序中的几个地方这样做。但是你必须使用@Named,这样你才能知道要注入哪个字符串。这是正确的,任何时候你想注入一个以上的某一类型的实例)。
发布于 2017-07-18 14:01:00
@Provides
File provideFile(String filePath){
return new File(filePath);
}错误出在这里。此函数查找未由Provides方法提供的字符串参数,因此可以将其更改为
@Provides
FileOutputStream provideFileOutputStream(File file) {
return new FileOutputStream(file);
}
@Provides
FileIntputStream provideFileIntputStream(File file) {
return new FileIntputStream(file);
}另一种解决方法是使用限定符或命名。既然你已经知道了Named,我就给你一个Qaulifiers的样本。
@Provides
@OutputQualifier
String provideOutFile(){
return outFilePath;
}
@Provides
@InputQualifier
String provideInFile(){
return inputFilePath;
}
@Provides
FileOutputStream provideFileOutputStream(@OutputQualifier String file) {
return new FileOutputStream(new File(file));
}
@Provides
FileIntputStream provideFileIntputStream(@InputQualifier String file) {
return new FileIntputStream(new File(file));
}限定符定义:
@Qualifier
public @interface InputQualifier {
}
@Qualifier
public @interface OutputQualifier {
}查看此视频了解有关限定词https://www.youtube.com/watch?v=WAENNp2wxbQ的更多信息
快乐编码:)
https://stackoverflow.com/questions/45152412
复制相似问题