2017-07-17 113 views
1

我想用双模式来获取文件,fileOutputStreamfileIntputStream的实例,所以我创建了一个模块,并提供所有三个依赖,但由于文件对象需要一个路径我通过它作为一个param匕首2注入参数

@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”的理念,以“注射剂”,并因为字符串是newable即其不具有固定的实现,我们需要手动调用它,如果因此di不能推断使用哪个对象,所以我的问题是可以用来创建在编译时已知的params对象,如果是的话,那么点它只是为了创建具有静态/固定参数的对象。

回答

1

你有种想法DI有点不对。 DI不接受参数,特别是Dagger--它是编译时的实现。 DI提供者的唯一合法参数是其他注入变量。如果你必须提供路径,那么在注入File时绝对有0点 - 只需在该点调用new。

如果你想获得一个特定的文件 - 可以说你的主分区的文件,你会使用注入的地方。那么你会有:

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

至于什么是DI-有一对夫妇。一个是它用于范围变量。另一种方法是通过注入变量而不是访问单例,使测试更容易 - 您可以轻松地将其放入部分实现,模拟或纯粹的测试实现中。它还可以轻松切换包括整个子系统在内的抽象接口的实现 - 只需切换添加的子组件即可。如果你想要的话,你可以注入一个字符串路径,我在我当前的应用程序的几个地方执行它,但是你必须使用@Named,这样你就可以知道要注入哪个字符串。注入超过一个类型的实例)。

+0

对不起,我的问题,我刚开始学习迪,所以只允许的参数是可以被注入的参数,即它们在编译时被设置,例如:在改进的构建器中注入okHttpClient,并且我查了几个地方但无法理解@Named如何工作,请您详细说明一下 – Nsnik

+0

如果您想提供2种相同类型,请使用@Proxy和@ Named(“name”)对提供者进行注释。然后当你注入它时,你注入了@ Named(“name”),所以它知道注入哪一个。例如@ Provide @ Named(“baseUri”)public void StringBaseUri(){return“http://example.com/”;} –

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

错误在这里。此功能查找未给出通过提供方法,所以你可以把它改成

@Provides 
FileOutputStream provideFileOutputStream(File file) { 
    return new FileOutputStream(file); 
} 

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

另一种方法是使用限定词或命名来解决字符串参数。既然你已经想通了命名我给你一个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

编码快乐:)

+0

该教程非常有帮助,谢谢 – Nsnik