首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2注入参数

Dagger 2注入参数
EN

Stack Overflow用户
提问于 2017-07-18 03:43:03
回答 2查看 2.4K关注 0票数 1

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

代码语言:javascript
复制
@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));
}

然后我得到了下面的错误:

代码语言:javascript
复制
"@inject constructor or from an @provides-annotated method. java.lang.string is injected"

在一些研究中,我遇到了"Newables","Injectables“的概念,因为string是一个newable,也就是说它没有固定的实现,我们需要手动调用它,如果它不能推断使用哪个对象,那么我的问题是,di只能用于创建其params在编译时是已知的对象,如果是这样,那么它的意义仅仅是创建具有静态/固定参数的对象。

EN

回答 2

Stack Overflow用户

发布于 2017-07-18 04:00:06

你对DI的想法有点错误。DI不带参数,尤其是Dagger-它是一个编译时实现。DI提供程序的唯一合法参数是其他注入变量。如果你无论如何都要提供路径,那么注入一个文件是绝对没有意义的--只要在这一点上调用new即可。

如果你想获得一个特定的文件,你可以使用注入--比如说你的主数据库的文件。然后你就会有:

代码语言:javascript
复制
@Provides
File provideFile(){
    return new File("/my/path);
}

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

(顺便说一句,如果你愿意,你可以注入一个字符串路径,我在我当前的应用程序中的几个地方这样做。但是你必须使用@Named,这样你才能知道要注入哪个字符串。这是正确的,任何时候你想注入一个以上的某一类型的实例)。

票数 3
EN

Stack Overflow用户

发布于 2017-07-18 14:01:00

代码语言:javascript
复制
@Provides
File provideFile(String filePath){
   return new File(filePath);
}

错误出在这里。此函数查找未由Provides方法提供的字符串参数,因此可以将其更改为

代码语言:javascript
复制
@Provides
FileOutputStream provideFileOutputStream(File file) {
    return new FileOutputStream(file);
}

@Provides
FileIntputStream provideFileIntputStream(File file) {
     return new FileIntputStream(file);
}

另一种解决方法是使用限定符或命名。既然你已经知道了Named,我就给你一个Qaulifiers的样本。

代码语言:javascript
复制
@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));
}

限定符定义:

代码语言:javascript
复制
@Qualifier
public @interface InputQualifier {
}


@Qualifier
public @interface OutputQualifier {
}

查看此视频了解有关限定词https://www.youtube.com/watch?v=WAENNp2wxbQ的更多信息

快乐编码:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45152412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档