Como criar uma classe Singleton perfeita em c #?
Eu quero armazenar alguns dados com a classe Singleton. Até onde eu estudei, a classe singleton só pode ser instanciada por uma vez. Mas isso não funciona para mim. Alguém pode corrigir meu código:
<code>public class MvcApplication : System.Web.HttpApplication { Singleton clientsessionidinstance = Singleton.GetInstance(); public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] { "MVCPrj.Controllers" } ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); LOGICcLASSES.Logic.Auth ca = new LOGICcLASSES.Logic.Auth(); clientsessionidinstance = Singleton.GetInstance(); clientsessionidinstance.ClientSessionID = ca.Login(new LOGICcLASSES.Entities.ClientAuthentication() { IP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"], UserName = ConfigurationManager.AppSettings["ClientUserName"], Password = ConfigurationManager.AppSettings["ClientPassword"] }); } protected void Application_AcquireRequestState(object sender, EventArgs e) { if (System.Web.HttpContext.Current.Session != null) { if (!string.IsNullOrEmpty(clientsessionidinstance.ClientSessionID)) { CurrentUserSession.Store<string>("ClientSessionID", clientsessionidinstance.ClientSessionID); } } } } </code>
Então o objetivo é este, @Application_Start
Eu tenho que fazer login em uma conta. Então eu deveria salvar a string de retornoHttpContext.Current.Session
.
Infelizmente não consigo acessar oHttpContext.Current.Session
dentroApplication_Start
mas é possível emApplication_AcquireRequestState
.
Eu posso usar uma variável que irá conter a string retornada e, em seguida, usar seu valor dentro doApplication_AcquireRequestState
, mas o grande problema é isso, a página carrega? duas vezes, então se eu usar uma variável, ela se tornaránull
na segunda carga, masApplication_Start
ainda é iniciado uma vez.
Então eu vim usando uma classe Singleton, mas ainda assim eu obtenho valores nulos na segunda carga.
Classe Singleton:
<code>using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCPrj.Areas.WebPage.Logic { public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { lock (typeof(Singleton)) { instance = new Singleton(); } return instance; } private string _ClientSessionID; public string ClientSessionID { get { return _ClientSessionID; } set { _ClientSessionID = value; } } } } </code>
EDITAR
Este código funciona para mim depois de lerSolteirão
<code>public class Singleton { private static readonly object _mutex = new object(); private static volatile Singleton _instance = null; private Singleton() { } public static Singleton Instance { get { if (_instance == null) { lock (_mutex) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } } private string _ClientSessionID; public string ClientSessionID { get { return _ClientSessionID; } set { _ClientSessionID = value; } } } </code>