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

标签 c# model-view-controller design-patterns singleton

我想用 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);
                }
            }
        }
    }  

所以目标是这样的,@Application_Start 我要登录一个账号。然后我应该将返回字符串保存在 HttpContext.Current.Session 上。
不幸的是,我无法访问 Application_Start 中的 HttpContext.Current.Session 但可以在 Application_AcquireRequestState 上访问。
我可以使用一个变量来保存返回的字符串,然后在 Application_AcquireRequestState 中使用它的值,但最大的问题是,页面加载了吗?两次,所以如果我要使用一个变量,它将在第二次加载时变为 nullApplication_Start 仍然会启动一次。
所以我想到了使用 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; }
        }
    }
}  

编辑

阅读后这段代码对我有用 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; }
    }
}

最佳答案

如果您使用的是 .NET4,“完美单例”通常最好使用 System.Lazy 来实现.

另见 this web page了解 C# 中许多不同的单例模式及其优缺点。

关于c# - 如何在 C# 中创建一个完美的 Singleton 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239765/

相关文章:

java - 在Java中使用Swing正确实现GUI开发中的MVC模式

c# - 从剪贴板保存 PNG 时出现黑色图像

c# - Linq 其中列表包含列表之一

c# - 当我的类多次实现 IEnumerable<T> 时,为什么我不能使用 LINQ to Objects?

php - 不依赖框架的 MVC 教程?

php - 如何使用 MVC 使用 PHP 表单更新 MySQL 数据库

java - 有没有更好的方法来跟踪订阅者的变化?

design-patterns - 结构与行为设计模式

c# - .NET 中是否有包含单个 EventHandler 的标准接口(interface)

c# - ASP.Net MVC C# 另一个 View 模型中的两个 View 模型 - 如何在 View 中引用