热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Dagger:在构造函数中注入命名字符串》经验,为你挑选了2个好方法。

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

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

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

我尝试做一个像这个链接中指定的模块=> Dagger:注入@Named字符串?

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

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

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

当我运行编译时,我收到此错误:

[ERROR] /Users/stocks/src/main/java/net/modules/TestModule.java:[22,7]错误:上java.lang.String中未注射的成员.你想添加一个注射构造函数吗?通过provideScanService(java.lang.String中,net.IYahooService),用于net.modules.TestModule所需

如何在构造函数中正确注入我的属性?

谢谢.



1> voronnenok..:

如果你的意思是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中实例化它

@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;
}



2> nhaarman..:

你有两个不同的名字: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;
}


推荐阅读
author-avatar
双木子婷_893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有