Hoy me encontré con un problema y un amigo me recomendó usar una instancia global estática o, más elegantemente, un patrón singleton. Pasé unas horas leyendo sobre singletons, pero algunas cosas aún se me escapan.Uso de singleton en lugar de una instancia global estática
Antecedentes: Lo que intento lograr es crear una instancia de una API y usar esta única instancia en todas mis clases (en lugar de hacer una nueva conexión, etc.).
Parece que hay alrededor de 100 formas de crear un singleton pero con un poco de ayuda de yoda Encontré algunos ejemplos seguros para hilos. .so dado el siguiente código:
public sealed class Singleton
{
public static Singleton Instance { get; private set; }
private Singleton()
{
APIClass api = new APIClass(); //Can this be done?
}
static Singleton() { Instance = new Singleton(); }
}
cómo/dónde habría que crear una instancia de la clase y este nuevo cómo debe ser llamado desde una clase separada?
EDIT: Soy consciente de la clase Singleton se puede llamar con algo como
Singleton obj1 = Singleton.Instance();
pero iba a ser capaz de acceder a los métodos de la clase API (es decir obj1.Start.)? (No es que necesite hacerlo, solo pregunta)
EDIT # 2: Pude haber sido un poco prematuro al verificar la respuesta, pero tengo una pequeña cosa que todavía me está causando problemas. La API está lanzando muy bien, desafortunadamente ¿puedo lanzar dos instancias?
Nuevo Código
public sealed class SingletonAPI
{
public static SingletonAPI Instance { get; private set; }
private SingletonAPI() {}
static SingletonAPI() { Instance = new SingletonAPI(); }
// API method:
public void Start() { API myAPI = new API();}
}
pero si trato de hacer algo como esto ...
SingletonAPI api = SingletonAPI.Instance;
api.Start();
SingletonAPI api2 = SingletonAPI.Instance; // This was just for testing.
api2.Start();
me sale un error que dice que no puedo iniciar más de una instancia.
Usted debe agregue un constructor privado, para evitar que otra clase cree una instancia de una copia de su Singleton. –
Gracias, me lo perdí. – Ryan
No podrá invocar métodos en la clase api, ya que no se está exponiendo. –