Lavorando con librerie come Seam, Guice e Spring, mi sono abituato a gestire variabili all'interno di un ambito. Queste librerie ti offrono una miriade di ambiti e ti consentono di definire la tua. Questo è un modello molto utile per gestire i cicli di vita variabili e l'iniezione delle dipendenze.
Ho cercato di identificare dove scope è la soluzione corretta o dove un'altra soluzione è più appropriata (variabile di contesto, singleton, ecc.). Ho scoperto che se il ciclo di vita dell'oscilloscopio non è ben definito, è molto difficile e spesso incline a gestire iniezioni in questo modo.
Ho cercato su questo argomento ma ho trovato poche discussioni sul modello. Esistono alcuni buoni articoli che discutono su dove utilizzare l'ambito e quali sono i prerequisiti / i prerequisiti suggeriti per l'ambito?
Sono interessato sia alla discussione di riferimento sia alla tua opinione su ciò che è richiesto o suggerito per una corretta implementazione dell'ambito. Tieni presente che mi riferisco all'ambito dell'ambito come idea generale, questo include cose come i singleton a livello globale, la variabile web con scope di richiesta o sessione, gli ambiti di conversazione e altri.
Modifica
Alcuni semplici sfondi su ambiti personalizzati: link
Alcune definizioni pertinenti in precedenza:
"scoping" - Un insieme di requisiti che definiscono quali oggetti vengono iniettati a che ora. Un semplice esempio di questo è l'ambito della discussione, basato su un ThreadLocal. Questo ambito inietterebbe una variabile basata su quale thread ha istanziato la classe. Ecco un esempio di questo:
"variabile di contesto" - Un repository passato da un oggetto a un altro contenente variabili rilevanti. Proprio come lo scoping, questo è un modo più bruto di accedere alle variabili in base al codice chiamante.
Esempio:
methodOne(Context context){
methodTwo(context);
}
methodTwo(Context context){
...
//same context as method one, if called from method one
}
"singleton globally scope" - Seguendo lo schema singleton, c'è un oggetto per istanza dell'applicazione. Questo vale per gli ambiti perché esiste un ciclo di vita di base per questo oggetto: c'è solo uno di questi oggetti istanziati.
Ecco un esempio di oggetto con scope Singleton JSR330:
@Singleton
public void SingletonExample{
...
}
utilizzo:
public class One {
@Inject
SingeltonExample example1;
}
public class Two {
@Inject
SingeltonExample example2;
}
Dopo l'istanziazione:
one.example1 == two.example2 //true;