Wie erstellen Sie eine perfekte Singleton-Klasse in c#?

Ich wollen speichern Sie einige Daten mit Singleton-Klasse. Soweit ich das untersucht habe, singleton-Klasse kann instanziert werden, nur für einmal. Aber es funktioniert nicht für mich. Kann jemand korrekt mein 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);
                }
            }
        }
    }  

Ziel ist es also, das, @ Application_Start ich mich anmelden in einem Konto. Dann sollte ich speichern Sie die return string auf HttpContext.Current.Session.

Leider kann ich nicht auf die HttpContext.Current.Session innen Application_Start aber es ist möglich, auf Application_AcquireRequestState.

Kann ich eine variable verwenden, halten Sie die zurückgegebene Zeichenfolge und verwenden Sie dann Ihren Wert innerhalb der Application_AcquireRequestState, aber das große problem ist das die Seite geladen wird? zweimal, also, wenn ich eine variable verwenden, wird es null im zweiten laden, aber Application_Start noch einmal initiiert.

So kam ich mit einer Singleton-Klasse, aber trotzdem bekomme ich null Werte, die auf der zweiten Last.

Singleton-Klasse:

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

BEARBEITEN

Dieser code funktioniert für mich nach dem Lesen 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; }
    }
}
das Rad nicht neu erfinden: csharpindepth.com/Articles/General/Singleton.aspx
Perfekte singleton ist ein oxymoron. Erstellen Sie eine Fabrik. Machen Sie nicht eine Klasse, die versucht zu verstehen, seiner eigenen Lebenszeit.

InformationsquelleAutor fiberOptics | 2012-04-20

Schreibe einen Kommentar