Dagger 2注入参数

时间:2017-07-17 19:43:03

标签: android dependency-injection dagger-2 dagger

我想使用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已知的对象,如果是,那么创建具有静态/固定参数的对象的重点是什么。

2 个答案:

答案 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

的更多信息

快乐编码:)