2012-12-10 69 views
3

這個問題大概是這樣的一個 Pass parameter to constructor with Guice如何通過Roboguice中的構造函數注入參數? [機器人]

差的精確複製是,我使用roboguice爲Android,而不僅僅是吉斯,所以答案有沒有爲我工作。

問題是 - 我如何將初始化參數傳遞到創建的對象?即我注入了一些界面,它應該用一些roboguice不知道的參數初始化。

我聯繫我提供看什麼,我應該創建工廠接口和這樣

void configure(Binder binder) { 
    binder.install(new FactoryModuleBuilder() 
     .implement(FooInterface.class, Foo.class) 
     .build(FooFactory.class)); 
    } 


註冊,但我不能找到FactoryModuleBuilder類。我使用Intellij IDEA,它可以顯示我可以在當前位置訪問的每個班級,並且我可以100%確定沒有以'工廠'字開頭的班級。

如何使用roboguice創建我的工廠?

修訂

我忘了下載guice-assistedinject。但我仍然無法弄清楚我應該在哪裏註冊這個工廠。

更新2

爲什麼我需要嗎?因爲應該存在一些抽象依賴的情況,這是Roboguice無法解決的。這種依賴可以是任何類型,甚至簡單的字符串或數字。

在我的情況下,我有UI上的NumberPicker控件,我想移動MyNumberPickerWrapper類中的所有UI特定任務。當我創建這個包裝器時,我通過構造函數注入它的依賴項(這個控件)。

這不是問題的關鍵,如果我有這樣的做法是正確的,但有可能是很多地方構造器注入需要另一個更適用的例子,該注射類不能被Roboguice

創建
+0

是不是這樣:https://github.com/emmby/roboguice/wiki/CustomBinding並在參數前添加註解@Inject? –

+0

@Eugen Martynov我認爲不行,因爲我無法在Provider.get方法中傳遞任何我想要的參數。 –

+0

從來沒有嘗試注入參數,但當我標記構造函數需要使用@Inject註釋的上下文它正確地實例化 –

回答

1

我遵循的步驟在Pass parameter to constructor with Guice給出的答案,並做了輕微的修改,以在roboguice下運行它。對我來說完全沒問題。

  1. 添加吉斯 - assistinject庫gradle這個腳本

    dependencies { compile 'com.google.inject.extensions:guice-assistedinject:4.+' } 
    
  2. 創建工廠接口與創建接受對象的構造函數需要參數和返回對象的接口方法

    public interface ICustomObjectFactory { 
        ICustomObject create(String queueName); 
    } 
    
  3. Add @Inject註釋到對象的構造函數和@Assisted對來自工廠的每個參數的註釋。

    public class CustomObject implements ICustomObject { 
        protected String name; 
    
        @Inject 
        public CustomObject(@Assisted String name){ 
         this.name = name; 
        } 
    } 
    
  4. 添加綁定到模塊所使用

    public class SomeModule extends AbstractModule { 
    
        @Override 
        protected void configure() { 
         install(new FactoryModuleBuilder() 
          .implement(ICustomObject.class, CustomObject.class) 
          .build(ICustomObjectFactory.class)); 
        } 
    } 
    
  5. 進樣工廠和創建對象的實例

    public class SomeClass { 
    
        @Inject ICustomObjectFactory factory; 
    
        public SomeClass() { 
         ICustomObject first = this.factory.create("first"); 
         ICustomObject second = this.factory.create("second"); 
        } 
    } 
    
0

我面臨同樣的問題,我成功歸功於Pavel's answer。我只需要努力解決一些錯誤,而且我不知道是否是由於使用的庫的版本所致,但是對於我來說,如果不修改構造函數的註釋,則不能工作,請將@Inject替換爲@AssistedInject。這樣,實現該接口的類的代碼如下所示。

public class CustomObject implements ICustomObject { 
    protected String name; 

    @AssistedInject 
    public CustomObject(@Assisted String name){ 
     this.name = name; 
    } 
} 
相關問題