我使用FileHandler
类获取File
作为ctor参数。
我想将它用于2个不同的File
s。
如何配置进样器每次注入不同的File
?
像getInstance
那样将会返回所需的具体实例的annoation?
注释在这里没有帮助,因为如果我把它放在ctor中,那么这个ctor的所有用法仍然会有一个注释。
public class StringFileWriter implements IResponsesStorage {
File file;
@Inject
@Singleton
public StringFileWriter(@myAnnotation File file) {
this.file = file;
}
和
public class MainModule extends AbstractModule {
@Override
protected void configure() {
File resultBaselineFile = new File(Constants.RESULTS_BASELINE_FILE);
bind(File.class).annotatedWith(ResultBaselineFile.class).toInstance(resultBaselineFile);
File logLatencyFile = new File(Constants.LATENCY_FILE);
bind(File.class).annotatedWith(LatencyLogFile.class).toInstance(logLatencyFile);
修改
主代码调用2个存储库:一个用于日志文件,第二个用于结果文件。每个存储库都有自己的文件处理程序。那就是问题
答案 0 :(得分:0)
这是所谓的"robot legs" problem的变体。正如上面的评论所述,正确的解决方案实际上取决于决策的位置。
以下是我在这种情况下如何解决这个问题:
public final class StringFileWriter implements IResponsesStorage {
private final File file;
// Note: constructor is not annotated with @Inject
StringFileWriter(File file) {
this.file = file;
}
// ...
}
public final class StringFileWriterModule extends AbstractModule {
@Override protected void configure() {}
@Provides
@Singleton
@ResultBaselineFile
StringFileWriter provideResultBaselineFileWriter(
@ResultBaselineFile File resultBaselineFile) {
return new StringFileWriter(resultBaselineFile);
}
@Provides
@Singleton
@LatencyLogFile
StringFileWriter provideLatencyLogFileWriter(
@LatencyLogFile File latencyLogFile) {
return new StringFileWriter(latencyLogFile);
}
}
然后在注射点你会选择你想要的StringFileWriter
:
final class MyWorkerClass {
private final StringFileWriter resultBaselineFileWriter;
@Inject MyWorkerClass(@ResultBaselineFile StringFileWriter writer) {
resultBaselineFileWriter = writer;
}
// ...
}