Jak stworzyć idealną klasę Singleton w c #?
Chcę przechowywać niektóre dane z klasą Singleton. O ile studiowałem, pojedynczą klasę można utworzyć tylko raz. Ale to nie działa dla mnie. Czy ktoś może poprawić mój kod:
<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>
Więc celem jest to, @Application_Start
Muszę zalogować się na konto. Następnie powinienem zapisać ciąg powrotuHttpContext.Current.Session
.
Niestety nie mogę uzyskać dostępu doHttpContext.Current.Session
wewnątrzApplication_Start
ale to możliweApplication_AcquireRequestState
.
Mogę użyć zmiennej, która będzie przechowywać zwrócony ciąg, a następnie użyć jego wartości wApplication_AcquireRequestState
, ale największym problemem jest to, że strona się ładuje? dwa razy, więc jeśli użyję zmiennej, stanie sięnull
przy drugim obciążeniu, aleApplication_Start
jest wciąż inicjowany raz.
Więc przyszedłem przy użyciu klasy Singleton, ale wciąż otrzymuję wartości null na drugim obciążeniu.
Klasa 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>
EDYTOWAĆ
Ten kod działa dla mnie po przeczytaniuSingel
<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>