2013-04-06 91 views
5

在吉斯,我已經當模塊構建的完全控制,並使用了一些模塊,我安裝構造函數參數。匕首模塊與構造函數的參數?

在匕首然而,引用其它模塊的方法是通過@Module包括註釋,並且不與創建模塊安裝的相同的方法呈現我。

是否有可能創建具有構造函數參數的多個模塊,一個理智的ObjectGraph?特別是那些能夠使用匕首編譯器工作,而不會遇到週期圖表的人?

回答

3

如果您有與使用同一個對象,那麼也許你應該該對象分成其自身的模塊多個模塊。例如,很多模塊使用的應用程序上下文,所以我有以下模塊:

@Module 
public class ContextModule { 

    private final Context mContext; 

    public ContextModule(Context context) { 
     mContext = context; 
    } 

    @Provides 
    public Context provideContext() { 
     return mContext; 
    } 

} 

所以現在在其他模塊時,當我需要一個上下文對象我只是包括模塊。

例如:

@Module(entryPoints = { MyFragment.class }, includes = { ContextModule.class }) 
public class ServicesModule { 

    @Provides 
    public LocationManager provideLocationManager(Context context) { 

     return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    @Provides 
    public Geocoder provideGeocoder(Context context) { 
     return new Geocoder(context); 
    } 
} 

然後,當我構造對象圖我最終只有一個模塊,是以應用程序上下文作爲其參數。

+3

因此,這與我已經完成的類似,我可以爲每個傳遞給ObjectGraph.create()的模塊提供構造函數...但是,我注意到的是,如果嘗試使用。再加上()...延長ObjectGraph在這一點上,圖中似乎失去先前構建模塊和炸彈的任何知識了與一個異常時,它會嘗試重新創建一個包含的模塊。 – thebamaman 2013-04-15 20:45:34

3

ObjectGraph.create()需要的模塊(可變參數)的變量列表,以便你能夠做到這一點:

ObjectGraph objectGraph = ObjectGraph.create(new ProductionModule(context), new OverridingTestModule()); 

在匕首的InjectionTest.java看一看(參見測試「moduleOverrides」那裏): https://github.com/square/dagger/blob/master/core/src/test/java/dagger/InjectionTest.java

+0

這是正確的。還要注意,你也應該在覆蓋測試模塊中設置overrides = True。 – 2013-08-19 13:37:29