1

我正在進入控制反轉,特別是使用GuiceRoboGuice對於Android,我有一個問題。控制反轉新對象創建

我有一個方法調用返回一個資源(實質上是一個XML或JSON字符串)。

public Resource getResource(){ 
// Some implementation details that call a web service and throw the result in a string... 
String resource = ........ 
} 

Resource類實際上只是一個包裹String,所以我想這是有道理的在通過它在構造函數中,因爲它是一個Resource對象的一個​​重要組成部分。

public class Resource{ 
    Resource(String theXMLorJSON){ 
    ... 
    } 
} 

幾個問題:

  1. 如何構建在getResource調用一個新的Resource?我認爲我想使用IoC而不是在方法中調用new
  2. 如果另一個類在構造函數中使用Resource,那麼在施工時需要動態String時,如何使用Guice容器構造它?我只是問了一個similar question,並且相信可能有一種使用Guice來處理這個問題的具體方法。

非常感謝!

回答

2

我認爲你可能會誤解有關依賴注入的東西。您無需設法避免在全部個案中使用new ...您主要希望避免使用new創建任何您可能希望能夠進行測試的模擬,並且通常最好允許容器連接任何依賴這樣的對象的類。

儘管如此,您的Resource類看起來像一個簡單的值對象,您可以在任何測試中手動輕鬆創建該對象。它也不依賴於任何種類的服務......它只包含String。所以沒有理由嘗試讓容器創建它。

另一方面,包含getResource()方法的類肯定需要容器創建,因爲您希望能夠在測試中使用依賴於該類的某些內容,而無需實際調用Web服務。

請注意,如果您有一個帶有構造函數的類,該構造函數需要容器注入的依賴關係以及只在運行時才知道的參數,則需要創建某種類型的中間工廠,只需要一個方法運行時參數。使用Guice,您可以使用Assisted Inject(不確定它是否適用於RoboGuice,但也可以手動創建此類工廠實現也很容易)從接口自動創建此類工廠。

+0

非常感謝您的回答。我也在弗吉尼亞州的阿靈頓,順便說一句。 – skaz

+0

如果你不介意的話,還有幾個問題。 1)爲什麼鏈接頁面的「手工工廠」部分中的示例採用「提供者」而不是「CreditService」?不能只注入「CreditService」? 2)如果我有另一個類,在構造函數中使用'Resource'的'ResourceUser',並且'Resource'構造函數使用'String',那麼我該如何設置Guice中的'ResourceUser'?對不起,如果這是天真的... – skaz

+0

這樣做是爲了確保工廠不改變'CreditService'的範圍。例如,'CreditService'可以是Web應用程序中的請求範圍,所以您需要確保每次調用工廠時都能獲得正確的實例。如果所有的依賴關係都是單例,你可以直接注入它們......但是你不應該在工廠中假設它。請參閱[注入提供商](http://code.google.com/p/google-guice/wiki/InjectingProviders)。 – ColinD