Dagger:将命名字符串注入构造函数中

问题描述 投票:8回答:3

我有一个属性文件,我想在服务中注入一个属性。

我想像这样使用DI的构造方法:

@Inject
public ScanService(@Named("stocks.codes") String codes, IYahooService yahooService) {
    this.yahooService = yahooService;
    this.codes = codes;
}

我尝试执行此链接中指定的模块=> Dagger: Inject @Named strings?

@Provides
@Named("stocks.code")
public String providesStocksCode() {
    return "test";
}

对于我的服务的提供者方法:

@Provides
@Singleton
public IScanService provideScanService(String codes, IYahooService yahooService){
    return new ScanService(codes, yahooService);
}

当我运行编译时,出现此错误:

[错误] /Users/stocks/src/main/java/net/modules/TestModule.java:[22,7] 错误:java.lang.String上没有可注入成员。您要添加吗 可注射的构造函数?要求 ProvideScanService(java.lang.String,net.IYahooService) 对于net.modules.TestModule

如何将属性正确注入构造函数中?

谢谢。

properties dependency-injection dagger
3个回答
8
投票

您有两个不同的名称:stocks.codesstocks.code

您还必须注释provideScanService codes参数:

@Provides
@Singleton
public IScanService provideScanService(@Named("stocks.codes") String codes, IYahooService yahooService){
    return new ScanService(codes, yahooService);
}

或这样做:

@Provides
@Singleton
public IScanService provideScanService(ScanService scanService){
    return scanService;
}

8
投票

[如果您指的是Dagger 2,我可以帮助您。首先,您必须在Component

中声明依赖项
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(BaseActivity baseActivity);

    @Named("cloud") UserDataSource userCloudSource();
    @Named("disc") UserDataSource userDiscSource(); 
    UserDataRepository userDataRepository();  
}

然后在模块中实例化它

@Module
public class ApplicationModule {

    @Provides @Named("cloud")
    UserDataSource provideCloudUserSource(UserCloudSource userSource) {
        return userSource;
    }

    @Provides @Named("disc")
    UserDataSource provideDiscUserSource(UserDiscSource userSource) {
        return userSource;
    }

    @Provides
    UserDataRepository provideUserRepository(UserDataRepository repository) {
        return repository;
    }

}

然后使用@Named限定词将其注入构造函数中>

@Inject
public UserDataRepository(@Named("cloud") UserDataSource cloudSource, 
     @Named("disc") UserDataSource discSource) {
    this.cloudDataSource= cloudSource;
    this.discDataSource = discSource;
}
    

0
投票

假设我在属性文件中有键值-stocks.code =测试我可以从此属性文件中注入stocks.code的值,而不是通过providerStocksCode()进行硬编码吗?

© www.soinside.com 2019 - 2024. All rights reserved.