Sto creando un'API di base in JavaSE, che include moduli come l'architettura MVP, Service & Livello del repository, Modello di eventi per attivare eventi tra relatore ecc.
Sto cercando di implementare tutte le migliori pratiche di progettazione del software. Recentemente, ho letto su Dependency Injection & i suoi vantaggi e ha deciso di utilizzare Guice
come quadro DI.
Dopo aver passato due giorni ad imparare Guice, sono ancora confuso con alcuni problemi di progettazione.
-
Se creo un
injector
utilizzandoGuice.createInjector(modules)
con i moduli principali della mia API,- Come rendere questa istanza di
injector
disponibile per le altre mie classi API? Si può iniettare un iniettore ed è una buona pratica? - Come rendere questa istanza di
injector
disponibile per l'utente API, in modo che possano utilizzare questo injector per creare istanze? - Dovrei renderlo disponibile anche all'utente API, perché potrebbe essere una cattiva pratica?
- Quindi utilizzarlo per un approccio AOP come questo e iniezioni personalizzate
- Come rendere questa istanza di
-
La creazione di iniettori è un'operazione pesante, se così fosse ci dovrebbero essere solo pochi iniettori per applicazione?
- Gli iniettori dovrebbero essere creati nella fase di avvio dell'applicazione o potrebbero essere creati in mezzo senza influire sul rendimento dell'applicazione?
Modifica
Per comprendere l'utilizzo di Provider
invece di iniettare injector, ecco un breve esempio di MVP:
interface ProductModel {
// Some method declarations
}
interface ProductView {
// Some method declarations
}
class ProductPresenter {
// Using Guice for constructor injection
@Inject
ProductPresenter(ProductModel model, ProductView view) {
this.model = model;
this.view = view;
}
}
class ProductViewImpl implements ProductView {
// Method Implementations
}
class ProductModelImpl implements ProductModel {
// Method Implementations
}
Ora, come inteso dalle risposte in basso per usare Provider<X>
invece di iniettare injector, ecco la classe Provider
.
class ProductPresenterProvider implements Provider<ProductPresenter> {
ProductPresenter get() {
// But, How to provide the ProductPresenter without model and view instances!
}
}