Comment créer un parfait Singleton classe en c#?

Je veux stocker des données avec classe Singleton. Autant que je l'ai étudié, classe singleton peut être instancié seulement pour une fois. Mais il ne fonctionne pas pour moi. Quelqu'un peut-il corriger mon 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);
                }
            }
        }
    }  

Donc, le but est de ce, @ Application_Start j'ai pour vous connecter à un compte. Ensuite, je dois enregistrer la chaîne de retour sur HttpContext.Current.Session.
Malheureusement, je ne peux pas accéder à la HttpContext.Current.Session à l'intérieur de Application_Start mais il est possible sur Application_AcquireRequestState.
Je peux utiliser une variable qui va contenir la chaîne retournée et ensuite utiliser sa valeur à l'intérieur de la Application_AcquireRequestState, mais le gros problème est présent, le chargement de la page? deux fois, donc si je vais utiliser une variable, il deviendra null à la deuxième charge, mais Application_Start est toujours déclenchée une fois.
Donc, je suis venu à l'aide d'une classe Singleton, mais encore obtenir les valeurs nulles à la deuxième charge.

Classe Singleton:

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; }
        }
    }
}  

MODIFIER

Ce code fonctionne pour moi après la lecture de Singleton

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; }
    }
}
ne réinventez pas la roue: csharpindepth.com/Articles/General/Singleton.aspx
Parfait singleton est un oxymore. Créer une usine. Ne pas faire une classe qui tente de comprendre sa propre vie.

OriginalL'auteur fiberOptics | 2012-04-20