Padrão C # Singleton com inicialização acionável
Eu preciso de um singleton que:
is preguiçoso carregadois thread safe carrega alguns valores na construção esses valores podem ser consultados a qualquer momento a inicialização PODE acontecer em algum momento preciso, antes do início da consulta - por isso devo ser capaz de acioná-la de fora de alguma forma. Obviamente, acionar várias vezes deve fazer a inicialização apenas uma veEu uso o .NET 3.5.
Comecei com o Jon Skeetimplementaçã (5ª versão) usando uma subclasse estática:
public sealed class Singleton
{
IEnumerable<string> Values {get; private set;}
private Singleton()
{
Values = new[]{"quick", "brown", "fox"};
}
public static Singleton Instance { get { return Nested.instance; } }
private class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
Isso marca quase todas as caixas, exceto a "inicialização do gatilho de fora". Como a inicialização real ocorre dentro do ctor, não pode ocorrer mais de uma ve
Como pode ser isto alcançado
O singleton será usado assim:
public static void Main(){
//do stuff, singleton should not yet be initialized.
//the time comes to initialize the singleton, e.g. a database connection is available
//this may be called 0 or more times, possibly on different threads
Singleton.Initialize();
Singleton.Initialize();
Singleton.Initialize();
//actual call to get retrieved values, should work
var retrieveVals = Singleton.Instance.Values;
}