Come posso usare guizzi per sostituire il codice in base all'implementazione del localizzatore di servizi?

0

Considera che ho un servizio chiamato FileSystem e che questo FileSystem è utilizzato da varie classi in tutta l'applicazione. In genere, il servizio viene acquisito tramite un metodo di classe statico ServiceLocator.getService (FileSystem.class)

Ora considera che ho un gioco di classe, che dipende dall'oggetto FileSystem per aprire alcune risorse dell'interfaccia utente. Il gioco costruirà anche un mondo, usando un WorldFactory. WorldFactory richiede anche il servizio FileSystem.

Ecco dove incontro il problema, costruisco una nuova istanza di WorldFactory - che richiede l'inserimento di un'istanza di FileSystem in esso. Tuttavia, Guice non si inietterà in oggetti che non ha costruito. Quindi WorldFactory rimane senza un FileSystem in esso inserito.

Quindi potrei passare un oggetto FileSystem a WorldFactory ma poi in sostanza Guice non ha risolto nessuno dei miei problemi e ho capito che non ho usato Guice correttamente perché posso fare tutto questo senza di esso?

Quindi si ottiene un'istanza dispari in cui il costruttore di un'entità di gioco richiede di passare un'istanza all'AudioSystem su cui può riprodurre l'audio. Diventa molto caotico con tutti questi oggetti / servizi che vengono esplicitamente passati.

Grazie. Sono ancora nuovo nel guizio e sto cercando di capire come usarlo.

    
posta Jeremy 22.06.2014 - 09:43
fonte

1 risposta

1

Sia Game che WorldFactory class avrebbero FileSystem come loro dipendenza. Di seguito è riportato un esempio di dipendenza immessa tramite un costruttore (è anche possibile immetterli direttamente nei campi):

@Inject
public Game(FileSystem fs) { }

@Inject
public WorldFactory(FileSystem fs) { }

Potresti quindi scrivere un fornitore all'interno di uno dei tuoi moduli che costruisce e restituisce una nuova istanza FileSystem :

@Provides
FileSystem provideFileSystem() {
    return ServiceLocator.getService(FileSystem.class);
}

Una volta trattati gli altri servizi in modo simile, sarai in grado di rimuovere completamente la tua dipendenza da ServiceLocator , spostando il codice di creazione del servizio direttamente nei provider.

So then you get an odd instance where the constructor of a game entity requires that you pass an instance to the AudioSystem to it which it can play audio through. It just gets very messy with all these objects/services being explicitly passed around.

Non solo questo non è disordinato, questo è il punto intero dell'iniezione di dipendenza. Il fatto è, comunque, che non dovresti mai passare esplicitamente tutte quelle istanze manualmente. Invece, puoi fare in modo che Guice ricostruisca il grafico delle dipendenze da loro e costruisca tutti gli oggetti intermedi necessari (o li ottenga in qualsiasi altro modo specificato nei tuoi fornitori). Da parte tua, creare l'oggetto finale è solo questione di chiamare Injector.getInstance(Foo.class) : tocca a Guice capire come satisificare le dipendenze.

    
risposta data 22.06.2014 - 18:57
fonte

Leggi altre domande sui tag