Wie erstelle ich eine perfekte Singleton-Klasse in c #?
Ich möchte einige Daten mit der Singleton-Klasse speichern. Soweit ich studiert habe, kann die Singleton-Klasse nur einmal instanziiert werden. Aber bei mir funktioniert es nicht. Kann jemand meinen Code korrigieren:
<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>
Das Ziel ist also, @Application_Start
Ich muss mich in ein Konto einloggen. Dann sollte ich den Return-String weiter speichernHttpContext.Current.Session
.
Leider kann ich nicht auf die zugreifenHttpContext.Current.Session
InnerhalbApplication_Start
aber es ist möglich aufApplication_AcquireRequestState
.
Ich kann eine Variable verwenden, die die zurückgegebene Zeichenfolge enthält, und dann ihren Wert innerhalb von verwendenApplication_AcquireRequestState
, aber das große Problem ist, dass die Seite geladen wird? zweimal, also wenn ich eine Variable verwenden werde, wird esnull
beim zweiten laden aberApplication_Start
wird noch einmal initiiert.
Also habe ich eine Singleton-Klasse verwendet, aber beim zweiten Laden erhalte ich immer noch Nullwerte.
Singleton-Klasse:
<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>
BEARBEITEN
Dieser Code funktioniert für mich nach dem LesenSingleton
<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>