2015-01-04 4 views
1

속성 파일이 있는데 서비스에 속성을 삽입하고 싶습니다.단검 : 생성자에 명명 된 문자열 삽입

이 같은 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); 
} 

컴파일을 실행할 때이 오류가 발생합니다 :

[ERROR] /Users/stocks/src/main/java/net/modules/TestModule.java:[22,7] error: No injectable members on java.lang.String. Do you want to add an injectable constructor? required by provideScanService(java.lang.String,net.IYahooService) for net.modules.TestModule

생성자에 내 등록 정보를 올바르게 삽입하려면 어떻게해야합니까?

감사합니다.

답변

4

stocks.codesstocks.code의 두 가지 이름이 있습니다.

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

을 아니면은 다음과 같이 수행하십시오 :

또한 provideScanServicecodes 매개 변수에 주석을해야합니다 당신이 대거이 의미하는 경우

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

:(덕분에 많은 생성자에 주입해야합니다. I를 @ Named에서 나쁜 이름을 보지 못했습니다.이 나쁜 질문에 대해 사과드립니다. – Kiva

4

, 난 당신을 도울 수 있습니다. 먼저 당신이

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

관련 문제