2017-07-17 101 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