如何在c#中创建一个完美的Singleton类?

fib*_*ics 3 c# model-view-controller singleton design-patterns

我想用Singleton类存储一些数据.据我所研究,单例类只能实例化一次.但它对我不起作用.有人可以更正我的代码:

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);
                }
            }
        }
    }  
Run Code Online (Sandbox Code Playgroud)

所以目标就是这个,@ Application_Start我必须登录一个帐户.然后我应该保存返回字符串HttpContext.Current.Session.
不幸的是我无法访问HttpContext.Current.Session内部,Application_Start但有可能Application_AcquireRequestState.
我可以使用一个变量来保存返回的字符串然后在其中使用它的值Application_AcquireRequestState,但是最大的问题是这个,页面加载了吗?两次,所以如果我将使用一个变量,它将成为null第二次加载但Application_Start仍然启动一次.
所以我开始使用Singleton类,但仍然在第二次加载时得到null值.

单身人士课程:

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; }
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)

编辑

阅读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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*cer 10

如果您使用的是.NET4,那么使用System.Lazy通常可以最好地实现"完美单例" .

另请参阅此网页,了解C#中许多不同单例模式的描述及其各种优缺点.