2010-12-28 10 views
1

Angenommen, wir haben 2 Klassen - Main und MainDependency. Die zweite Klasse wird nur von Main verwendet, und der Zweck der Verwendung von IoC besteht darin, eine Instanz der Klasse Main zu erstellen.Was ist der richtige Weg, Eigenschaften mit Guice einzustellen?

MainDependency Klasse hat ein Feld vom Integer-Typ. Dieses Feld muss nicht gesetzt sein (oder nehmen wir an, es sollte immer einen Standardwert haben, wenn nichts anderes angegeben ist).

Das Problem: Was ist der richtige Weg, um das Integer-Feld zu setzen? Eine Möglichkeit, die ich sehe, ist, ein ähnliches Feld in meinem Module zu erstellen und diesen Wert dann innerhalb des Moduls configure zu verwenden. Aber ich finde es falsch.

Bitte teilen Sie Ihre Erfahrung. Danke im Voraus.

Antwort

2

Ich glaube, Sie vor allem zwei Möglichkeiten:

1) Injizieren konstant Bindung verwenden. Der Wert von MY_CONSTANT könnte zur Instanziierungszeit an Module übergeben werden; könnte aus einer Systemeigenschaft oder vielleicht auf andere Weise entnommen werden.

class MainDependency{ 
    @Inject 
    public MainDependency(@Named("myConst") int myConst){ 
    //... 
    } 
} 

class Module extends AbstractModule{ 
    public void configure(){ 
    bindConstant().annotatedWith(Names.named("myConst").to(MY_CONSTANT); 
    } 
} 

2) Verwenden Sie unterstützt inject eine Fabrik zu schaffen, die Ihren Wert als Parameter übernehmen und geben eine Instanz von MainDependency:

interface MainDependencyFactory{ 
    MainDependency create(int myConst); 
} 

class MainDependency{ 
    @Inject 
    public MainDependency(@Assisted int myConst){ 
    //.. 
    } 
} 

class Module extends AbstractModule{ 
    public void configure(){ 
    bind(MainDependencyFactory.class).toProvider(
     FactoryProvider.newFactory(MainDependencyFactory.class, MainDependency.class)); 
    } 
} 

//to use the above, instantiate your factory (or inject it somewhere) 
MainDependencyFactory f = injector.getInstance(MainDependencyFactory.class); 
//Then you can create MainDependency with any value 
MainDependency md = f.create(MY_CONSTANT); 

Beachten Sie, dass Sie mit unterstützt inject brauchen nicht zu implementieren MainDependencyFactory. Guice wird es für Sie erstellen.

Verwandte Themen