Domanda

È possibile nidificare una classe singleton all'interno di una classe non singleton in C# e, in tal caso, in questo caso ci sono restrizioni al ciclo di vita del singleton?

public class NonSingletonClass
{
  public NonSingletonClass()
  {
    // Initialize some stuff.
  }

  // Put some methods here.

  public class SingletonClass
  {
    // Singleton construction goes here.

    // Put some methods here.
  }
}

Nella progettazione della mia applicazione, questo ha senso, ma devo conoscere eventuali trucchi prima di implementarlo effettivamente.

MODIFICARE:Nello specifico, ho un host di lavoro che esegue attività in base a un timer.IL NonSingletonClass in questo caso è un'istanziazione di un'attività.IL SingletonClass è un archivio di dati utilizzato da NonSingletonClass, ma può essere modificato dall'esterno NonSingletonClass. SingletonClass esiste per garantire che anche se ce ne sono più NonSingletonClass casi, ci sarà ancora un solo set di istruzioni e dati per tutti loro.

È stato utile?

Soluzione

Credo che siete alla ricerca di un modello di monostate

questo link è una buona descrizione di questo e offre contrats con un pattern Singleton monostate modello

Altri suggerimenti

Sì, un singleton può vivere comodamente all'interno di un non-singleton.

Il ciclo di vita della classe annidata è completamente indipendente dal ciclo di vita della classe esterna.C'è pochissima differenza tra una classe annidata e una classe non annidata in C#.(Ci sono Alcuni differenze: la classe nidificata ha accesso ai membri privati ​​della classe esterna e i metodi di estensione devono trovarsi in una classe statica non nidificata, ad esempio, ma ciò non influisce sul ciclo di vita.

Avevi una preoccupazione specifica?

Credo che la mia prima domanda è potrebbe darci più specifiche considerando lei ha dichiarato "la progettazione della mia applicazione questo ha un senso". Abstract Factory e costruttore sono solo alcuni schemi che utilizzano le classi singleton. State immagazzinando una sorta di dati globali da utilizzare all'interno NonSingletonClass.

Non penso che ci siano problemi con un singleton annidato considerando che nessuna delle due classi ha un riferimento all'altra.Considerando che dici che il singleton fornisce archiviazione di dati mutabili per diverse istanze, penso che i tuoi potenziali problemi saranno legati alla concorrenza.

Questi si applicano solo se è consentito l'accesso multi-thread, ovvero prima dobbiamo garantire che siano presenti i blocchi appropriati in modo che il singleton sia sempre in uno stato valido.In secondo luogo, se lo stato singleton sta cambiando e gli oggetti accedono in ordine non deterministico, i risultati non saranno prevedibili (cioèuna condizione di gara).

Se la concorrenza non è un problema con l'applicazione, trovo che l'uso di classi nidificate private sia un modo eccellente per nascondere i dettagli di implementazione e garantire che ogni oggetto abbia un solo ruolo.

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