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>

Antworten auf die Frage(7)

Ihre Antwort auf die Frage