Ecco il mio problema:Custom Guice Scope o un approccio migliore?
È innanzitutto importante sapere che sto scrivendo una simulazione. Questa è un'applicazione standalone ed è single-threaded. Ho essenzialmente due classi di oggetti che hanno requisiti di ambito diversi.
Classi che devono essere utilizzate come singleton durante l'intera simulazione. Un'istanza di Random, ad esempio.
Gruppi di classi create insieme e all'interno del gruppo, ciascuna istanza deve essere trattata come un Singleton. Ad esempio, supponiamo che
RootObject
sia la classe di primo livello e abbia una dipendenza daClassA
e daClassB
, entrambi con una dipendenza daClassD
. Per qualsiasi datoRootObject
, entrambe le sue dipendenze (ClassA
eClassB
) devono dipendere dalla stessa istanza diClassD
. Tuttavia, le istanze diClassD
non devono essere condivise tra diverse istanze diRootObject
.
Speriamo che abbia senso. Posso pensare a due approcci a questo. Uno è quello di contrassegnare tutti gli oggetti iniettati come Singletons, creare l'iniettore di radici e far scattare un iniettore di bambini ogni volta che ho bisogno di creare una nuova istanza RootObject
. Quindi, le istanze di RootObject
e tutte le relative dipendenze vengono create come Singletons, ma quelle informazioni di ambito vengono eliminate la prossima volta che vado a creare un altro RootObject
.
Il secondo approccio consiste nell'implementare un tipo di ambito personalizzato.
La documentazione di Guice fornisce consigli contrastanti ... Da una parte, si dice che si dovrebbe avere un singolo iniettore e che idealmente si chiama una volta per creare una classe di alto livello. D'altra parte, dice di stare lontano dagli ambiti personalizzati.
Ho un'idea che l'iniezione @Assisted potrebbe essere usato qui, ma sto avendo difficoltà a vedere esattamente come dovrebbe essere utilizzato ... – Rich
@Josh: Da dove viene il docu dicono stare lontano dagli obiettivi? –
@ A.H., Http://code.google.com/p/google-guice/wiki/CustomScopes - prima riga. "In genere è consigliabile che gli utenti non scrivano i propri ambiti personalizzati: gli ambiti integrati dovrebbero essere sufficienti per la maggior parte delle applicazioni." Ho scoperto che il primo approccio funziona molto bene - creando gli iniettori del bambino secondo necessità. Dobbiamo solo stare attenti che i "singleton per gruppo" non vengano accidentalmente legati nell'iniettore genitore, ma è abbastanza facile da controllare. – Josh