我想使用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"并且因为字符串是一个新的,即它没有固定的实现,我们需要手动调用它,如果它因此di不能推断使用哪个对象,所以我的问题可以用于仅创建编译时params
已知的对象,如果是,那么创建具有静态/固定参数的对象的重点是什么。
答案 0 :(得分:1)
你有点认为DI有点不对劲。 DI不接受参数,尤其不是Dagger-它是一个编译时实现。 DI提供者的唯一合法参数是其他注入变量。如果必须提供路径,那么注入文件绝对有0分 - 只需在此时调用new。
如果你想获得一个特定的文件,你可以使用注入 - 让我们说你的主数据库的文件。然后你会:
@Provides
File provideFile(){
return new File("/my/path);
}
关于DI的重点是什么?一个是用于范围变量。另一种方法是通过注入变量而不是访问单例,使您可以轻松地进行部分实现,模拟或纯测试实现,从而使测试更容易。它还可以轻松切换抽象接口的实现,包括整个子系统 - 只需切换您添加的子组件。
(顺便说一句,如果你想要你可以注入一个字符串路径,我会在当前应用程序中的几个地方进行。但是你必须使用@Named以便你可以告诉哪个字符串要注入。当你想要注入时,这是真的超过1个某种类型的实例)。
答案 1 :(得分:1)
@Provides
File provideFile(String filePath){
return new File(filePath);
}
错误就在这里。此函数查找String参数,该参数不是由Provide方法提供的,因此您可以将其更改为
@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
的更多信息快乐编码:)