Domanda

Mi chiedo cosa hanno gli ampli che folino due attacchi:

bind(PermissionManager.class).in(Singleton.class);

e

bind(PermissionManager.class);

Ho letto i Javadocs, stanno seguendo. Per Singleton:

/**
* Apply this to implementation classes when you want only one instance
* (per {@link Injector}) to be reused for all injections for that binding.
*
* @author crazybob@google.com (Bob Lee)
*/

Per nessun ambito:

/**
* No scope; the same as not applying any scope at all.  Each time the
* Injector obtains an instance of an object with "no scope", it injects this
* instance then immediately forgets it.  When the next request for the same
* binding arrives it will need to obtain the instance over again.
*
* <p>This exists only in case a class has been annotated with a scope
* annotation such as {@link Singleton @Singleton}, and you need to override
* this to "no scope" in your binding.
*
* @since 2.0
*/

Cosa significa in termini pratici? I singoli sono per cliente o per JVM? Per nessun ambito, ogni istanza è diversa?

È stato utile?

Soluzione

In termini pratici per Gin, l'ambito di Singleton ha più senso se considerato per istanza del cliente, o ancora più accuratamente, per istanza di ginjector. Se commetti l'errore di fare due giniettori da GWT.createIn caso di istanza due volte, probabilmente avrai un "singleton" per istanza, poiché ogni ginjettore può solo tenere traccia delle istanze che gestisce.

Quindi ogni volta che l'applicazione si carica, avrà il suo singleton. Se l'utente apre la stessa applicazione due volte in due schede diverse, ognuna avrà il suo singleton. Potresti considerare ogni scheda come la sua JVM, in quanto avrà una sua copia di tutte le classi e non sarà in grado di comunicare o chiamare metodi* sull'altra finestra.

Per nessun ambito, sì, per impostazione predefinita ogni istanza è diversa. Quando un tipo è @InjectEd, sarà una nuova istanza lì, ma se tu @Inject un Provider Per un campo, ogni volta che chiami get() Puoi ottenere un nuovo istanza. Questo può essere utile per ottenere facilmente diverse istanze di recente iniezione.

I singoli hanno senso da usare in due casi principali

  • Quando l'istanza contiene uno stato condiviso che deve essere comune in molte iniezioni, il caso più comune.
  • Quando l'istanza è costosa da creare - sul server questo viene spesso fatto come un pool, quindi non vengono creati più di X oggetti, ma gli oggetti costosi sul client tendono ad essere viste, con molti widget e generalmente più di uno non è richiesto.

* È possibile chiamare metodi su un'altra finestra, ma è necessario utilizzare le funzionalità del browser per questo, pubblicando un messaggio, non solo passando un oggetto avanti e indietro.

Altri suggerimenti

I singoli vengono creati solo una volta dal ginjettore di alto livello che crei (e per la maggior parte delle applicazioni, crei solo un ginjettore).

Gli oggetti non copiti vengono creati ogni volta che vengono iniettati come dipendenza in un altro oggetto. Quindi ogni istanza sarà diverso. In realtà non hai bisogno di scrivere Bind (SomeClass.class) se non hai intenzione di farlo applicare (o fare nessuna delle altre cose che il legante DSL può farti fare a un legame). Basta avere il costruttore predefinito o aggiungere @Inject a un costruttore consentirà a Gin di crearlo.

In generale, quando si utilizza Guice o Gin, vuoi lasciare le cose non scopite a meno che tu non abbia una buona ragione per non farlo. Consiglierei di leggere sul Documentazione di Guice sugli ambiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top