2012-12-20 76 views
1

我是新來的Guice,所以如果這是一個愚蠢的問題,但我覺得它非常令人沮喪。Guice模塊綁定對象構建與注入類

在我的模塊中,我構造了一個對象,它是我不控制的框架的成員。然後綁定該實例,以便稍後可以使用injector.getInstance(FrameworkClass.class)來訪問它;

當我構建該對象時,我想使用我自己的一個對象,它本身被註釋爲由構造函數注入。

public class MyClass { 
    OtherClass dependency; 

    @Inject 
    Public MyClass(OtherClass dependency) { 
     .... 
    } 
} 

public class AModule extends AbstractModule { 

    protected void configure() { 
     MyClass frameworkDependency = ??? 
     FrameworkClass fc = new FrameworkClass(frameworkDependency); 
     bind(FrameworkClass.class).toInstance(fc); 
    } 
} 

在這個例子中OtherClass僅僅是一個簡單的類不帶註釋的,但默認的空構造,所以吉斯應該只是新一輪上漲和它作爲我的理解提供MyClass的構造函數。

我的問題是如何訪問我的模塊中的MyClass的新實例,以便我可以將其提供給框架類?

以前我必須通過現場注射注入我自己的類,所以它看起來像這樣:

public class MyClass { 

    @Inject 
    OtherClass dependency;  
} 

public class AModule extends AbstractModule { 

    protected void configure() { 
     MyClass frameworkDependency = new MyClass(); 
     requestInjection(frameworkDependency); 
     FrameworkClass fc = new FrameworkClass(frameworkDependency); 
     bind(FrameworkClass.class).toInstance(fc); 
    } 
} 

我寧願保持MyClass的,如果可能的構造函數注入。

回答

2

如果使用@Provides方法,就像在答案中一樣,每個參數都將通過注入器解析 - 包括使用綁定註釋的依賴項,並且包括類型Provider<MyClass>而不僅僅是MyClass的參數。注入Provider s是在一個類中檢索多個依賴項實例的最佳方法。

@Provides FrameworkClass provideFrameworkClass(
    Dependency1 dep1, Provider<Dependency2> dep2Provider) { 
    return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get()); 
} 

如果所有綁定都可以通過吉斯發現,你可以更多或更少的外部用toConstructor binding標記與@Inject構造。請注意,Guice文檔實際上比這種技術更喜歡@Provides技術,因爲反射式構造函數本質上比依賴於編譯器更脆弱。不過,如果你有一個長參數列表,這可能是一個不錯的選擇。最後,如果你的@Provides方法足夠大(或者具有足夠複雜的邏輯)以適合它自己的類,那麼你總是可以創建自己的Provider<FrameworkClass>實現 - 完全按照你想要的那樣完成 - 手動執行創建(通過bind(FrameworkClass.class).toProvider(FrameworkClassProvider.class)約束。

0

所以我找到了答案我自己的問題(最簡單的形式):

通過移動框架對象爲提供方法的配置,我可以通過MyClass的對象作爲參數的方法和吉斯負責處理該參數,ALA的實例:

@Provides 
@Singleton 
FrameworkClass provideFrameworkClass(MyClass dependency) { 
    return new FrameworkClass(frameworkDependency); 
} 

但是,乞求什麼更復雜的情況下發生的問題,如果我的框架沒有采取什麼樣的單一依賴,但ñ他們(說這是一個調度員採取一堆行動),我不能只擴展我的provideFrameworkClass方法來採取n +參數?